2010-02-19 68 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"); 
    } 
}) 

我在我的代码应用和工作正常。