2010-02-19 67 views
4

在解析AJAX加載的表格中的複選框時出現錯誤,但出現錯誤,說明該小部件具有該ID已被註冊:
「Error('Tried to註冊部件與id == userListUncheckAll但該ID已註冊')「在AJAX加載的內容上解析dojoType

而我猜這發生的原因是我們拿出當前表,然後用我們從AJAX調用返回的東西取代它,並且因此元素ID將是相同的。有沒有辦法「註銷」小部件或類似的東西?

回答

4

我找到了答案,這個我自己,所以我把它放在這裏爲他人:

如果你有一組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(); 
} 

工程就像一個魅力。

+1

這太瘋狂了!這應該是Dojo/Dijit 101和文檔。我的意思是有一個JS框架的全部意義是做花式的AJAX事情。如果返回的頁面不能渲染它是Dijits,那麼有什麼意義呢?!?! – Sevenearths 2011-09-05 11:22:56

1

獲取您要插入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」添加到所需模塊的列表中。

0

Dojo Parser文檔包含此一小段代碼片段:

dojo.xhrGet({ 
    url: "widgets.html", 
    load: function(data){ 
    dojo.byId("container").innerHTML = data; 
    dojo.parser.parse("container"); 
    } 
}) 

我在我的代碼應用和工作正常。