Разница между id и data-dojo-id

В чем разница между id и data-dojo-id в теге dojo, например:

<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", это не сработает.

Я довольно новичок в Додзё, так что объяснение или учебное пособие, на которое вы можете указать мне, будут очень благодарны!

1 ответ

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>​

ИМО, data-dojo-id предназначен для прогрессивного улучшения, а не для полноценных приложений.

data-dojo-id просто назначает экземпляр переменной, так что с несколькими джиитами с одинаковыми data-dojo-id переменная будет указывать на последний назначенный (то есть это не будет массив).

Вы можете избежать широкого использования registry.byId Написание вашего метода для получения виджетов в соответствии с вашими потребностями. Лучший способ начать это dijit/registy.findWidgets(rootNode, skipNode), Пожалуйста, обратите внимание, что dojo/parser.parse(rootNode, options) возвращает массив созданных объектов или, точнее:

Возвращает смешанный объект, который является массивом созданных объектов, но также может включать обещание, которое разрешается с помощью созданных объектов. Это сделано для обратной совместимости. Если синтаксический анализатор автоматически требует модули, он всегда будет вести себя обещанным образом и parser.parse().then(function(instances){...}) должен быть использован.

Пример метода, который я использую для назначения ди-джитов ContentPane в его 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,

Другие вопросы по тегам