10

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 相当陌生,因此您可以指出我的解释或教程将不胜感激!

4

1 回答 1

13

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是为了渐进增强,而不是为了成熟的应用程序。

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.

于 2012-09-18T05:05:23.960 回答