data-dojo-id
将小部件分配给全局命名空间,即分配给window
对象:
<button data-dojo-id="save" data-dojo-type="dijit/form/Button">Save</button>
因此您可以直接访问该按钮:
save.set("label", "Add New");
查看 jsFiddle 的不同之处:http: //jsfiddle.net/phusick/7yV56/
编辑:回答你的问题。我根本不使用data-dojo-id
。它污染了与 AMD 所做的完全相反的全局命名空间。无论如何,您仍然可以使用类似的东西widgets.save
并widgets.rename
尽量减少污染:
<button data-dojo-id="widgets.save" data-dojo-type="dijit/form/Button">Save</button>
<button data-dojo-id="widgets.rename" data-dojo-type="dijit/form/Button">Rename</button>
IMO,data-dojo-id
是为了渐进增强,而不是为了成熟的应用程序。
data-dojo-id
只是将一个实例分配给一个变量,因此对于具有相同的多个 dijit,data-dojo-id
该变量将指向最后一个分配的变量(即它不会是一个数组)。
您可以避免大量使用registry.byId
编写方法来根据需要获取小部件。最好的开始方式是dijit/registy.findWidgets(rootNode, skipNode)
. 另请注意,它dojo/parser.parse(rootNode, options)
返回一个实例化对象数组,或者更准确地说:
返回一个混合对象,它是一个实例化对象的数组,但也可以包含一个用实例化对象解析的承诺。这样做是为了向后兼容。如果解析器自动需要模块,它将始终以承诺方式运行并且
parser.parse().then(function(instances){...})
应该使用。
我用来将 ContentPane 的 dijits 分配到其widgets
属性的方法示例,该属性是一个对象:
_attachTemplateWidgets: function(widgets) {
widgets = widgets || this.getChildren();
for(var each = 0; each < widgets.length; each++) {
var widget = widgets[each];
var attachPoint = widget.params.dojoAttachPoint;
if(attachPoint) {
this.widget[attachPoint] = widget;
}
var children = widget.getChildren();
if(children.length > 0) {
this._attachTemplateWidgets(children);
}
}
}
我把整个课程放在这里:https ://gist.github.com/3754324 。我用这个app.ui._Pane
代替dijit/layout/ContentPane
.