Разница между идентификатором и данными - 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", "Добавить новый" );

Если я использую id = "save" , он работает. Если я использую только данные dojo -id = "save" , это не сработает.

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

Ответы

Ответ 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>​

IMO, data-dojo-id существует прогрессивное улучшение, а не для полноценных приложений.

data-dojo-id просто присваивает экземпляр переменной, поэтому с несколькими dijits с тем же 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.