代码之家  ›  专栏  ›  技术社区  ›  peirix

在Ajax加载的内容上分析DojoType

  •  4
  • peirix  · 技术社区  · 15 年前

    在分析使用Ajax加载的表中的复选框时,我会遇到一个错误,但我会得到一个错误,说明具有该ID的小部件已注册:
    “错误(‘尝试注册id==userListUncheckAll的小部件,但该id已注册’)”

    我猜会发生这种情况,因为我们取出了当前表,然后用从Ajax调用中得到的内容替换它,因此元素ID是相同的。有没有一种方法可以“注销”这些小部件或类似的东西?

    3 回复  |  直到 12 年前
        1
  •  4
  •   peirix    15 年前

    我自己找到了答案,所以我把它放在这里给其他人:

    如果您有一组需要“注销”的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();
    }
    

    很有魅力。

        2
  •  1
  •   Josh G    13 年前

    获取要向其中插入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”添加到所需模块的列表中。

        3
  •  0
  •   Alfredo Carrillo    12 年前

    Dojo Parser 文件包括此代码截图:

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

    我申请了我的代码,工作得很好。