id和data-dojo-id之间的区别

时间:2012-09-18 01:16:36

标签: dojo

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的新手,所以您可以向我指出的解释或教程将不胜感激!

1 个答案:

答案 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.savewidgets.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