在解析AJAX加載的表格中的複選框時出現錯誤,但出現錯誤,說明該小部件具有該ID已被註冊:
「Error('Tried to註冊部件與id == userListUncheckAll但該ID已註冊')「在AJAX加載的內容上解析dojoType
而我猜這發生的原因是我們拿出當前表,然後用我們從AJAX調用返回的東西取代它,並且因此元素ID將是相同的。有沒有辦法「註銷」小部件或類似的東西?
在解析AJAX加載的表格中的複選框時出現錯誤,但出現錯誤,說明該小部件具有該ID已被註冊:
「Error('Tried to註冊部件與id == userListUncheckAll但該ID已註冊')「在AJAX加載的內容上解析dojoType
而我猜這發生的原因是我們拿出當前表,然後用我們從AJAX調用返回的東西取代它,並且因此元素ID將是相同的。有沒有辦法「註銷」小部件或類似的東西?
我找到了答案,這個我自己,所以我把它放在這裏爲他人:
如果你有一組ID的,你知道將需要「未註冊」,創建ID的數組名稱:
try {
dojo.parser.parse();
} catch (e) {
var ids = ['id1', 'id2', 'id3'];
dijit.registry.forEach(function(widget) {
//remove this check if you want to unregister all widgets
if (dojo.indexOf(ids, id) {
widget.destroyRecursive();
}
});
dojo.parser.parse();
}
工程就像一個魅力。
獲取您要插入AJAX內容的父節點並僅解析此節點。你會得到這個錯誤,因爲DOM中的其他小部件會被解析兩次。像這樣:
require(["dojo/dom", "dojo/parser", "dojo/_base/xhr"/*, etc */ ],
function(dom, parser, xhr) {
var request = xhr.get({
// your details here
});
request.then(function(data) {
// transform data if necessary
var parentNode = dom.byId("/* parent id */");
parentNode.innerHTML = data;
// This is where the widgets get built!
parser.parse(parentNode); // or parser.parse("/* parent id */");
}, function(err) {
// handle error
});
});
此外,請確保您包含正確的dojo/dijit模塊。一個常見的錯誤是忘記包含您試圖插入的小部件的模塊。例如,如果您使用TabContainer,請將「dijit/layout/TabContainer」添加到所需模塊的列表中。
內Dojo Parser文檔包含此一小段代碼片段:
dojo.xhrGet({
url: "widgets.html",
load: function(data){
dojo.byId("container").innerHTML = data;
dojo.parser.parse("container");
}
})
我在我的代碼應用和工作正常。
這太瘋狂了!這應該是Dojo/Dijit 101和文檔。我的意思是有一個JS框架的全部意義是做花式的AJAX事情。如果返回的頁面不能渲染它是Dijits,那麼有什麼意義呢?!?! – Sevenearths 2011-09-05 11:22:56