dojo标记中的id和data-dojo-id之间的区别是什么:
<button id="save" data-dojo-type="dijit/form/Button" type="button" data-dojo-attach-event="onClick:save">Save</button>
我尝试引用此按钮来更改它的标签: var myButton = dijit.byId(“save”); 这样我就可以更改按钮标签了 myButton.set(“label”,“Add New”);
如果我使用id =“save”就行了。如果我只使用data-dojo-id =“save”,它就不起作用。
我是Dojo的新手,所以您可以向我指出的解释或教程将不胜感激!
答案 0 :(得分:12)
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
适用于progressive enhancement,不适用于成熟的应用程序。
data-dojo-id
只是为变量分配一个实例,因此对于具有相同data-dojo-id
的多个dijit,变量将指向最后一个(即它不是数组)。
您可以避免大量使用registry.byId
编写您的方法来根据您的需要获取小部件。最好的开始方式是dijit/registy.findWidgets(rootNode, skipNode)
。还请注意,dojo/parser.parse(rootNode, options)
返回一个实例化对象数组,或更确切地说:
返回一个混合对象,它是实例化对象的数组, 但也可以包含通过实例化解决的promise 对象。这样做是为了向后兼容。如果是解析器 自动需要模块,它将始终以承诺方式行事 应该使用
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
。