以编程方式而非声明方式实例化小部件时出现 Dojo 重复 ID 错误
Dojo duplicate ID error when instantiating a widget programmatically, but not declaratively
我正在使用 Dojo 1.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>
对于上面的代码,我遇到了错误 "Tried to register widget with id==dijit_layout_ContentPane_0 but that id is already registered"。但是,如果我删除脚本中的 TestWidget 实例化并将 'testnode' 替换为:
<div data-dojo-type="demo/TestWidget"></div>
它工作正常。知道我做错了什么吗?
我认为问题是在创建新元素时解析正在进行,因为 parseOnLoad
为真。如果您可以将其设置为 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传递给Widget,以便在模板中替换它。确保每个实例的 ID 都是唯一的。
我的理解是,在声明性方法中,如果在声明性语法中未明确提及 id,则会自动创建唯一 id。
我正在使用 Dojo 1.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>
对于上面的代码,我遇到了错误 "Tried to register widget with id==dijit_layout_ContentPane_0 but that id is already registered"。但是,如果我删除脚本中的 TestWidget 实例化并将 'testnode' 替换为:
<div data-dojo-type="demo/TestWidget"></div>
它工作正常。知道我做错了什么吗?
我认为问题是在创建新元素时解析正在进行,因为 parseOnLoad
为真。如果您可以将其设置为 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传递给Widget,以便在模板中替换它。确保每个实例的 ID 都是唯一的。
我的理解是,在声明性方法中,如果在声明性语法中未明确提及 id,则会自动创建唯一 id。