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