Разница между 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
,