在AJAX加载的内容上解析dojoType

时间:2010-02-19 08:46:39

标签: ajax dojo

在解析加载了AJAX的表中的复选框时出现错误,但是我收到一条错误,说明具有该ID的窗口小部件已经注册:
“错误('尝试注册具有id == userListUncheckAll的小部件,但该ID已经注册')”

我猜这是因为我们拿出当前的表,然后将它替换为我们从AJAX调用中返回的内容,因此元素id将是相同的。有没有办法“取消注册”小部件或类似的东西?

3 个答案:

答案 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");
  }
})

我在我的代码中应用并且工作正常。