додзё: использование register.byID возвращает неопределенное значение

У меня проблемы с получением кнопки-виджета с помощью dojo/registry.

У меня есть виджет, и внутри его postCreate-функции вызываются некоторые другие функции. В последнем registry.byId() возвращает "undefined", вызывая ошибку. Элемент с указанным идентификатором существует в html-шаблоне.

Я также создал очень простую рабочую версию в JSFiddle, и даже если я попробую этот вариант в своем коде, я получить «неопределенное». EDIT: обновлен Fiddle

Вот краткое изложение кода с исходным использованием registry.byId() в функции _setupButton, а также с решением из JSFiddle до части declare. Обе версии возвращают «undefined»:

define(["dojo/_base/declare", "dojo/_base/array", "dojo/_base/lang", "dojo/dom-class", "dojo/number", "dojo/parser", "dojo/ready", "dojo/dom-construct", "dijit/registry", "dijit/form/NumberTextBox", "dijit/_Widget", "dijit/_TemplatedMixin", "dijit/Menu", "dijit/MenuItem", "dojo/text!./templates/template.html"],
function(declare, array, lang, domClass, number, parser, ready, domconstruct, registry, NumberTextBox, _Widget, _TemplatedMixin, Menu, MenuItem, templateStringContent) {

parser.parse();
ready(function () {
     console.info(registry.byId("startCalculationButton"));
});

return declare([_Widget, _TemplatedMixin],
{
    templateString: templateStringContent,

    postCreate() {
       this._setupButton();
    },
    _setupButton: function() {
       buttonWidget = registry.byId("startCalculationButton");
       buttonWidget.set("disabled", true);
    },
});

});

HTML такой же, как и в предоставленном JSFiddle-Snippet. Другие идентификаторы (для других элементов) также не будут работать. Так почему же registry.byId() мне не подойдет? Я новичок в стиле AMD, и код уже работал со старым синтаксисом, используя dijit.byId.

Изменить:

Выяснил, что виджет не прописан в реестре-объекте. Что может быть причиной этого? Если бы шаблон не был найден, я бы получил ошибку 404, поэтому эту причину мы можем исключить.

Изменить2:

Также document.getElementById() просто вернет null. Я думал, что передачи templateString будет достаточно, а dojo сделает все остальное?


person Onsokumaru    schedule 08.06.2015    source источник
comment
Что отвечает за первоначальное создание/размещение startCalculationButton?   -  person Ken Franqueiro    schedule 08.06.2015
comment
Я забыл вставить одну строку кода. Я тяну шаблон с додзё/текстом! как указано в документации dojo, и передать эту строку templateString-участнику . Есть ли у меня что-то еще, чтобы заставить это работать?   -  person Onsokumaru    schedule 09.06.2015


Ответы (2)


Согласно документации по dojo, помимо _TemplatedMixin виджету также необходимо _WidgetsInTemplateMixin и наследуемся от него:

Но что, если мы хотим иметь виджет внутри шаблона, например:

<div class="combinedDateTime">
   <div data-dojo-type="dijit/form/DateTextBox"></div>
   <div data-dojo-type="dijit/form/TimeTextBox"></div>
</div>

При использовании этого шаблона в непосредственно расширенном классе виджета вам потребуется добавить dijit._WidgetsInTemplateMixin в дополнение к dijit._TemplatedMixin.

Поскольку кнопка dijit будет виджетом внутри моего шаблона, поэтому добавление _WidgetsInTemplateMixin и наследование от него решили мою проблему без необходимости других изменений. Мой код теперь выглядит примерно так (сокращенно):

define(["dojo/_base/declare", "dijit/registry", "dijit/_Widget", "dijit/_TemplatedMixin", "dijit/_WidgetsInTemplateMixin", "dojo/text!./templates/template.html"],
function(declare, registry, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, templateStringContent) {

return declare([_Widget, _TemplatedMixin, _WidgetsInTemplateMixin],
{
    templateString: templateStringContent,

    postCreate() {
       this._setupButton();
    },
    _setupButton: function() {
       buttonWidget = registry.byId("startCalculationButton");
       buttonWidget.set("disabled", true);
    },
});
person Onsokumaru    schedule 10.06.2015
comment
Отличный ответ, решил мою проблему, я не смог получить идентификатор строки из шаблона виджета, и теперь я могу после добавления этого - person Juan; 28.08.2020

Я заметил, что в вашем коде есть что-то, что может потребовать особого внимания:

require([
    "dojo/ready",
    "dijit/registry"
], function(
    ready,
    dijitRegistry
) {
    ready( function() {
        var grid = dijitRegistry.byId("startCalculationButton");
        console.info(grid)
        grid.set("disbaled", true);
    });
});

Я думаю, что это должно быть: /strong>.byId("имя")

если вы используете dgrid/extensions/DijitRegistry с синтаксисом запроса, то вы должны указать DijitRegistry после синтаксиса запроса (напомните, регистр чувствителен), но на основе по моему опыту, я использовал это только для миксина dgrid...

Надеюсь, это поможет...

person Paul Wu    schedule 10.06.2015
comment
хм... теперь я немного запутался. Когда я разместил свой вопрос о JSFiddle, он работал... теперь он не работает, и я понимаю, почему вы разместили этот намек. Но изменение скрипки, как вы рекомендуете, не помогает, и JSFIddle по-прежнему не работает для меня... Теперь я действительно запутался... - person Onsokumaru; 10.06.2015
comment
Это моя версия после редактирования: jsfiddle.net/1x3dat6e/14 кнопка не будет отображаться вверх, но, по крайней мере, он может прочитать, что такое сетка (кнопка) - person Paul Wu; 10.06.2015
comment
Спасибо! Я обновил исходный пост новой ссылкой. К сожалению, ваши идеи не помогают мне с моей реальной проблемой. Смотрите оригинальный пост. - person Onsokumaru; 10.06.2015
comment
И... как насчет этого, jsfiddle.net/1x3dat6e/50 я заметил, что вы не t включил claro css, поэтому кнопка не будет отображаться... а затем я перекодировал ее, используя dom/ready, как вы писали ранее - person Paul Wu; 10.06.2015
comment
Вы также можете увидеть эту ссылку: jsfiddle.net/1x3dat6e/52 Я хочу сказать, что вы должны пусть синтаксический анализатор dojo сначала проанализирует ваш HTML-документ, чтобы он мог быть распознан dijit/registry... - person Paul Wu; 10.06.2015
comment
Возможно, вам нужно сначала включить dijit/form/Button. dijit/form/Button не может быть обнаружен автоматически, если вы никогда не включали его первым... (в разделе require) - person Paul Wu; 10.06.2015
comment
Я включил диджит/форму/кнопку безрезультатно. Странно то, что даже document.getElementById не работает и возвращает null. Независимо от того, использую ли я parser.parse() или ready() - person Onsokumaru; 10.06.2015
comment
Это действительно имеет значение? Я знаю, что хорошей практикой является сохранение аргументов обратного вызова с самоописанием, но я просто переименовал случайный ресурс в foo в параметрах, и это сработало (конечно, сразу после этого я переименовал его обратно) - порядок аргументов таков. имеет значение. Как попытка научить рыбу ОП в другой ситуации неплохо, хотя в данном случае это не поможет. - person Pavel V.; 24.03.2016