javascript - List查看getListItemXmlAttributes方法失败, 显示子发布项目

  显示原文与译文双语对照的内容

当项目被修改时,我创建了一个JS类来填充 sg/文件夹列表视图数据。 ( 按方法)的jaime一切工作当我在出版项目的操作中创建。

磅 Ex: 我打开一个组件或者页面,自定义 locked by 列立即更新并显示我的用户名。

但是,当我转到一个子出版物并重复该进程时,我得到窗口询问是否要本地化或者编辑父项目。 如果选择编辑父窗口,则代码不起作用。 我还没有在最初的调试中找到它。 Chrome 似乎吞下了错误,Firefox 给了我一个神秘的信息:

时间戳:6/22/2012 3: 42: 54 PM

错误:未捕获的异常:[ 异常。。"组件返回失败代码: 0 x80004002 ( NS_NOINTERFACE ) [nsIWebProgress.DOMWindow]"nsresult: "0x80004002 ( NS_NOINTERFACE )"位置:"js框架: :chrome://browser/content/tabbrowser.xml: ::: 第 545行"数据: 没有]

谁有最初的想法? 稍后我会尝试发布一些代码。。

来自 PageEx.js的代码:


Type.registerNamespace("MyCompany.Tridion.RTFExtensions");

/*
* Constructor
*/

MyCompany.Tridion.RTFExtensions.PageEx = function (id) {
 Type.enableInterface(this,"MyCompany.Tridion.RTFExtensions.PageEx");
 this.addInterface("Tridion.ContentManager.Page", [id]);
 var p = this.properties;
 p.versionNumberString = undefined;
 p.modifiedBy = undefined;
 p.lockedBy = undefined;
 p.approvalStatus = undefined;
 p.publishDate = undefined;
 p.previousVersion = undefined;
 p.previousApprovalStatus = undefined;
 p.customModifiedDate = undefined;
 p.initialModifierUserName = undefined;
};

/*
* sends the list xml string for the item 
*/
MyCompany.Tridion.RTFExtensions.PageEx.prototype.getListItemXmlAttributes = function (customAttributes) {
 var attribs = {};
 $extUtils.getListItemXmlAttributes(customAttributes,this, attribs);
 return this.callBase("Tridion.ContentManager.Page","getListItemXmlAttributes", [attribs]);
};


/*
* This method gets called when an item is opened from list view. node parameter has the information
* displayed in the list view as attributes. We are getting cutom data extender column information 
* from this xml node and storing it in this class member for returning it from getListItemXmlAttributes method
*/
MyCompany.Tridion.RTFExtensions.PageEx.prototype.setDataFromList = function (node, parentId, timeStamp) {
 $extUtils.setDataFromList(node,parentId,timeStamp,this);
 this.callBase("Tridion.ContentManager.Page","setDataFromList", [node, parentId, timeStamp]);
};

/* 
* Gets item icon 
*/
MyCompany.Tridion.RTFExtensions.PageEx.prototype.getItemIcon = function () {
 var icon = this.callBase(this.defaultBase,"getItemIcon");
 return icon;
};

来自 utils.js的代码:


//reloads the list view for the given id (used in list view data refresh when JS cant get the required data without reloading)
MyCompany.Tridion.RTFExtensions.Utilities.reloadListView = function (listTcmId) {
 var registry = $models.getListsRegistry();
 for(var key in registry)
 {
 var entry = $models.getItem(registry[key]);
 if (entry && entry.getParentId() == listTcmId)
 {
 entry.unload();
 return true;
 }
 }
 return false;
}

/*
* This method gets called when an item is opened from list view. node parameter has the information
* displayed in the list view as attributes. We are getting cutom data extender column information 
* from this xml node and storing it in this class member for returning it from getListItemXmlAttributes method
*/
MyCompany.Tridion.RTFExtensions.Utilities.setDataFromList = function (node, parentId, timeStamp, itemClicked) {
 var p = itemClicked.properties;

 if (!timeStamp || timeStamp> itemClicked.getTimeStamp()) {
 var tmp;
 if (tmp = node.getAttribute('Version')) {
 p.versionNumberString = tmp;
 p.previousVersion = tmp;
 }
 if (tmp = node.getAttribute('ModifiedBy')) {
 p.modifiedBy = tmp;
 p.initialModifierUserName = tmp;
 }
 if (tmp = node.getAttribute('LockedBy')) {
 p.lockedBy = tmp;
 }
 if (tmp = node.getAttribute('ApprovalStatus')) {
 p.approvalStatus = tmp;
 p.previousApprovalStatus = tmp;
 }
 if (tmp = node.getAttribute('PublishDate')) {
 p.publishDate = tmp;
 }
 if (p.customModifiedDate === undefined) {
 if (tmp = node.getAttribute('Modified')) {
 p.customModifiedDate = tmp;
 }
 }
 }
}

/*
* sends the list xml string for the item in the list view.
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListItemXmlAttributes = function (customAttributes, listViewObject,attribs) {
 var p = listViewObject.properties;
 $extUtils.getListViewItemLockedByName(p,listViewObject);

 if (customAttributes) {
 for (var attr in customAttributes) {
 attribs[attr] = customAttributes[attr];
 }
 }

 attribs["Version"] = $extUtils.getListViewItemUpdatedVersion(p,listViewObject);
//modified name has to come after the version update...
 $extUtils.getListViewItemModifiedByName(p,listViewObject);
 attribs["ApprovalStatus"] = $extUtils.getListViewItemApprovalStatus(p,listViewObject); 
 attribs["PublishDate"] = $extUtils.getListViewItemPublishDate(p,listViewObject);

//set default values
 if (p.versionNumberString!= undefined) {
 var iResult = p.versionNumberString.localeCompare(p.previousVersion);
 if (p.previousVersion === undefined || iResult> 0) {
//it's been updated!
 p.previousVersion = p.versionNumberString;
 p.previousApprovalStatus = p.approvalStatus;

//also need to update modified date
 p.customModifiedDate = $extUtils.getListViewItemUpdatedModifiedDate(p,listViewObject);
 p.initialModifierUserName = p.modifiedBy;
 }

 }
 attribs["Modified"] = p.customModifiedDate;
 attribs["LockedBy"] = p.lockedBy;
 attribs["ModifiedBy"] = p.modifiedBy;

};

/*
* This method sets the property of the Revisor owner on the item in the list view. however, if it's not the current user
* we have no way to look that up in JS so we have to reload the list view.
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemModifiedByName = function (p,listViewObject) {
 var p = listViewObject.properties;
 var xmlDoc = listViewObject.getXmlDocument();
 if (xmlDoc) {
//modifier should always exist...
 var modifierId = $xml.getInnerText(xmlDoc,"/tcm:*/tcm:Info/tcm:VersionInfo/tcm:Revisor/@xlink:title");
 if (modifierId!= undefined) {
 var u = Tridion.UI.UserSettings.getJsonUserSettings(true);
 if (modifierId == u.User.Data.Name) {
 var strDescription = u.User.Data.Description.split('(');
 p.modifiedBy = strDescription[0];
 return;
 } else {
//we're in trouble...
//let's hope it's the initial modifier we had...
 if (p.previousVersion == p.versionNumberString) {
//whew...
 p.modifiedBy = p.initialModifierUserName;
 return;
 }

 if (!$extUtils.reloadListView(listViewObject.getOrganizationalItemId())) {
//hrm. something failed on the reload? not sure what else to do:
 p.modifiedBy = modifierId;
 }
 }
 } else {
//shouldn't ever happen.
 p.modifiedBy ="";
 return;
 }
 }

};

/*
* This method sets the property of the lock owner on the item in the list view. however, if it's not the current user
* we have no way to look that up in JS so we have to reload the list view.
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemLockedByName = function (p,listViewObject) {
 var xmlDoc = listViewObject.getXmlDocument();
 if (xmlDoc) {
//this will be user id. no sense getting tcmid... can't look it up without async call
 var lockedUserId = $xml.getInnerText(xmlDoc,"/tcm:*/tcm:Info/tcm:VersionInfo/tcm:ItemLock/tcm:User/@xlink:title");
 if (lockedUserId!= undefined) {
//see if it's the current user. most likely...
 var u = Tridion.UI.UserSettings.getJsonUserSettings(true);
 if (lockedUserId == u.User.Data.Name) {
 var strDescription = u.User.Data.Description.split('(');
 p.lockedBy = strDescription[0];
 return;
 }
//it's not the current user. no synch way to do what we want, plus the JS call doesn't get the workflow version anyway. refresh the parent view
 if (!$extUtils.reloadListView(listViewObject.getOrganizationalItemId())) {
//hrm. something failed on the reload? not sure what else to do:
 p.lockedBy = lockedUserId;
 }
 } else {
//clear it out since there's no lock owner
 p.lockedBy ="";
 }
 }
};

/*
* Gets the ApprovalStatus from the item
* This makes absolutely no sense... but for some reason the approval status gets wiped out when this method
* enters. so I had to use a"previous approval status" variable to maintain it. no idea why. I don't see anything
* else that should be touching it... but clearly something clears it out.
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemApprovalStatus = function (p,listViewObject) {
//check if the item has actually been modified.
 if (p.versionNumberString!= p.previousVersion) {
 var xmlDoc = listViewObject.getXmlDocument();
 if (xmlDoc) {
 p.approvalStatus = $xml.getInnerText(xmlDoc,"/tcm:*/tcm:Info/tcm:Data/tcm:ApprovalStatus/@xlink:title");
 }
 } else {
 p.approvalStatus = p.previousApprovalStatus;
 }
 if (p.approvalStatus === undefined || p.approvalStatus.toUpperCase() == 'UNAPPROVED') {
 var foo = p.approvalStatus;
 p.approvalStatus = 'WIP';
 }
 return p.approvalStatus;
};


/*
* Gets the PublishDate from the item list view
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemPublishDate = function (p,listViewObject) {
//modification won't alter publish date.
 var p = listViewObject.properties;
 return p.publishDate;
};


/*
* get the modified date for the workflow version, overwrite OOB since that uses last major version
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemUpdatedModifiedDate = function (p,listViewObject) {
 var xmlDoc = listViewObject.getXmlDocument();
 var modDate = $xml.getInnerText(xmlDoc,"/tcm:*/tcm:Info/tcm:VersionInfo/tcm:RevisionDate");
 return modDate;
}


/*
* Gets the updated Version information from the item
*/
MyCompany.Tridion.RTFExtensions.Utilities.getListViewItemUpdatedVersion = function (p,listViewObject) {
 var p = listViewObject.properties;
 var xmlDoc = listViewObject.getXmlDocument();
 var newVersionString = undefined;
 if (xmlDoc) {
 newVersionString = String.format("{0}.{1}", $xml.getInnerText(xmlDoc,"/tcm:*/tcm:Info/tcm:VersionInfo/tcm:Version"), $xml.getInnerText(xmlDoc,"/tcm:*/tcm:Info/tcm:VersionInfo/tcm:Revision"));
 }
 if (newVersionString!= undefined) {
//want to ensure we're getting a LATER version than we had (because it will try to load the non-workflow version afterwards...
 var iResult = newVersionString.localeCompare(p.previousVersion);
 if (p.previousVersion === undefined || iResult> 0) {
 p.versionNumberString = newVersionString;
 } else {
 p.versionNumberString = p.previousVersion;
 }
 } else {
 p.versionNumberString = p.previousVersion;
 }
 return p.versionNumberString;
};



function launchPopup(winURL, winName, winFeatures, winObj) {
//this will hold our opened window
 var theWin;
//first check to see if the window already exists
 if (winObj!= null) {
//the window has already been created, but did the user close it?
//if so, then reopen it. Otherwise make it the active window.
 if (!winObj.closed) {
 winObj.focus();
 return winObj;
 }
//otherwise fall through to the code below to re-open the window
 }
//if we get here, then the window hasn't been created yet, or it
//was closed by the user.
 theWin = window.open(winURL, winName, winFeatures);
 return theWin;
}

var $extUtils = MyCompany.Tridion.RTFExtensions.Utilities;

时间:

[ 异常。。"组件返回失败代码: 0 x80004002 ( NS_NOINTERFACE ) [nsIWebProgress.DOMWindow]"

这意味着没有分配给 nsIWebProgress 对象的窗口。 所以它没有显示数据。

nsresult:" 0 x80004002 ( NS_NOINTERFACE )"位置:"js框架: :chrome://browser/content/tabbrowser.xml: ::: 第 545行"数据: 没有]

这告诉你哪个文件与那个错误相关联。 它在什么线路上出错。

,但真正的键是NS_NOINTERFACE错误。 这意味着接口还没有注册。

你正在使用 Type.enableInterface() 。这是你在别处声明的自定义方法? 我看不到。你可能想要将它的更改为 .registerInterface()

查看这里链接类型类Type.registerInterface()

...