2010-05-04 8 views
26

Я новичок в Dojo Toolkit. Я получаю ошибкуDojo и незарегистрированные виджеты

Tried to register widget with id=myButton but that id is already registered 

всякий раз, когда я пытаюсь загрузить додзё содержание в два раза (то есть I содержание нагрузки HTML через jQuery.Load в контейнер DIV). Есть ли способ отменить регистрацию уже зарегистрированных виджетов в додзе? Я видел несколько примеров, но я действительно не заставляю их работать.

Моя кнопка:

<button dojoType="dijit.form.Button" id="myButton">button</button> 

ответ

35

Если вы хотите, чтобы отменить специальные виджеты, вы можете использовать их destroy() или destroyRecursive() методов. Второй уничтожает любые виджеты внутри того, который вы уничтожаете (т. Е. Вызов destroyRecursive в виджет формы также уничтожит все компоненты формы).

В вашем случае, это звучит, как вам лучше всего было бы сделать это до jQuery.load -

var widgets = dijit.findWidgets(<containerDiv>); 
dojo.forEach(widgets, function(w) { 
    w.destroyRecursive(true); 
}); 

Приведенный выше код будет разрегистрировать все виджеты в <containerDiv>, и сохраняют связанный с ним DOM узлов. Чтобы уничтожить узлы DOM, перейдите затем false в destroyRecursive.

Ссылка:

http://dojotoolkit.org/api/1.3/dijit/_Widget/destroyRecursive

+1

Другие лица, которые ищут решение: См. Также нижеприведенное решение для нерекурсивного решения. –

+0

Именно то, что я искал. Огромное спасибо! – mtchuente

4

Это работает для меня:

dijit.byId('myButton').destroy(true); 
1

Я думаю, вы бы лучше извлекать идентификатор из вашей кнопки, и доступ к нему используя присоединять точку. Вы бы в основном сделали <button dojoType="dijit.form.Button" data-dojo-attach-point="myButton">button</button>

тогда в вашем коде вы бы получили к нему доступ, как this.myButton.... однако им не уверен, какую версию dojo вы используете. Это устранит любые проблемы с идентификатором, поскольку додзе автоматически назначит ему уникальный идентификатор.

Смежные вопросы