Javascript 以编程方式(而非声明方式)实例化小部件时出现Dojo重复ID错误

Javascript 以编程方式(而非声明方式)实例化小部件时出现Dojo重复ID错误,javascript,dojo,Javascript,Dojo,我正在使用Dojo1.10 我正在尝试测试一个自定义小部件,但当我以编程方式将其添加到HTML文件中时,遇到了一个关于重复ID的错误。以声明方式添加它可以正常工作。在过去,当我不小心在小部件模板中使用了ID属性时,我会遇到这个错误,但是我在这个模板中没有ID。下面是一个简化的示例: demo/TestWidget.js define([ "dojo/_base/declare", "dijit/_WidgetBase", "dijit/_TemplatedMixin", "dij

我正在使用Dojo1.10

我正在尝试测试一个自定义小部件,但当我以编程方式将其添加到HTML文件中时,遇到了一个关于重复ID的错误。以声明方式添加它可以正常工作。在过去,当我不小心在小部件模板中使用了ID属性时,我会遇到这个错误,但是我在这个模板中没有ID。下面是一个简化的示例:

demo/TestWidget.js

define([
  "dojo/_base/declare",
  "dijit/_WidgetBase",
  "dijit/_TemplatedMixin",
  "dijit/_WidgetsInTemplateMixin",
  "dojo/text!./template/TestWidget.html",
  "dijit/layout/ContentPane",
], function(declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, template) {
     return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {
       baseClass: 'TestWidget',
       templateString: template,
     });
   });
demo/TestWidget.html

<div data-dojo-attach-point="containerNode">
  <div data-dojo-type="dijit/layout/ContentPane">
    Random Stuff
  </div>
</div>

随机的东西
index.html:

<head>
  <script>
    var baseloc = location.pathname.replace(/\/[^/]+$/, "");
    var dojoConfig = {
      parseOnLoad: true, async: true,
      packages: [ { name: "demo", location: baseloc + "/demo" } ]
    };
  </script>

  <script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"></script>
  <script>
    require([ "demo/TestWidget.js", "dojo/domReady!" ], function(TestWidget) {
        var widget = new TestWidget({ }, 'testnode');
    });
  </script>
</head>

<body class="claro">
  <div id="testnode"></div>
</body>

var baseloc=location.pathname.replace(/\/[^/]+$/,“”);
var dojoConfig={
parseOnLoad:true,async:true,
包:[{name:“demo”,位置:baseloc+“/demo”}]
};
需要([“demo/TestWidget.js”,“dojo/domReady!”),函数(TestWidget){
var widget=newtestwidget({},'testnode');
});
对于上面的代码,我得到了一个错误“试图注册id==dijit\u layout\u ContentPane\u 0的小部件,但该id已经注册”。但是如果我删除脚本中的TestWidget实例化并将“testnode”替换为:

<div data-dojo-type="demo/TestWidget"></div>


它工作正常。知道我做错了什么吗?

我认为问题在于,由于
parseOnLoad
为true,在创建新元素时解析正在进行。如果您可以将其设置为false,并在需要时显式调用
parse
,则应该能够避免它。

尝试为模板中的内容窗格设置唯一id:

<div data-dojo-attach-point="containerNode">
  <div data-dojo-type="dijit/layout/ContentPane" data-dojo-id=myContentPane_{id}>
    Random Stuff
  </div>
</div>

随机的东西
将id传递给构造函数中的小部件,以便在模板中替换它。确保每个实例的id都是唯一的


我的理解是,在声明式方法中,如果在声明式语法中没有明确提到id,则会自动创建唯一id。

我不认为
domReady确保
parseOnLoad
已完成。尝试使用老式的
ready
。或者显式地调用
parse
,并在完成后创建小部件。谢谢你的建议,罗伊。我以前也尝试过,结果相同,但这次当我同时设置
dojoConfig.parseOnLoad=false
时,它起了作用。如果你想加上这个作为答案,我会接受的。