在解析加载了AJAX的表中的复选框时出现错误,但是我收到一条错误,说明具有该ID的窗口小部件已经注册:
“错误('尝试注册具有id == userListUncheckAll的小部件,但该ID已经注册')”
我猜这是因为我们拿出当前的表,然后将它替换为我们从AJAX调用中返回的内容,因此元素id将是相同的。有没有办法“取消注册”小部件或类似的东西?
答案 0 :(得分: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 :(得分: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”添加到所需模块列表中。
答案 2 :(得分:0)
在Dojo Parser文档中包含此代码段:
dojo.xhrGet({
url: "widgets.html",
load: function(data){
dojo.byId("container").innerHTML = data;
dojo.parser.parse("container");
}
})
我在我的代码中应用并且工作正常。