Javascript-форум (https://javascript.ru/forum/)
-   Dojo toolkit (https://javascript.ru/forum/dojotoolkit/)
-   -   Обработка элементов в dijit.Dialog (https://javascript.ru/forum/dojotoolkit/12133-obrabotka-ehlementov-v-dijit-dialog.html)

Белый Тигр 02.10.2010 13:50

Обработка элементов в dijit.Dialog
 
Здравствуйте. Столкнулся с такой странной проблемой. Есть на странице 2 кнопки - добавление данных и редактирование. Для обоих действий есть разные по составу формы и 2 диалога (dijit.dialog), в которых эти формы должны отображаться. При нажатии на первую кнопку, с сервера получается HTML-код формы, помещается в параметр content (dialog.attr(...))одного из диалогов, и диалог показывается с помощью show(). В итоге пользователь видит форму добавления. Со второй кнопкой аналогично, только форма другая.
И вот в чём проблема. Если зайти на страницу и открыть форму добавления, то все элементы в ней, имеющие dojoType, отображаются с нужными визуальными эффектами. Закрываю её, открываю диалог с формой редактирования - элементы имеющие dojoType нужных эффектов не имеют. По сути они просто не обрабатываются. И наоборот - если обновить страницу и сначала открыть форму редактирования, то с ней всё хорошо. Закрываем её, открываем форму добавления - ни один элемент не обрабатывается. При этом мы можем несколько раз открывать/закрывать тот диалог который открыли первым - с его элементами всегда всё будет хорошо.
Думал что содержимое диалогов может как-то влиять на обработку друг-друга. Попробовал поставить onClose у диалогов в this.destroy(). Не помогло :( Подскажите пожалуйста, что ещё можно попробовать?
P.S. Версия Dojo последняя.

Белый Тигр 04.02.2011 14:24

Через столько времени решение всё же найдено :)
Оказывается при обработки виджетов в диалогах они намертво застревают в DOM страницы. Когда открывается второй диалог, у которого элементы имеют те же id что и у первого, то они не обрабатываются т.к. Dojo видит уже существующие виджеты с такими id.
Поэтому в onClose или onHide диалога нужно прописать вызов функции, которая бы ко всем виджетам которые есть в форме вызывала dijit.byId('widget_id').destroy() предварительно уничтожая и сам диалог.

revvo 11.02.2011 14:08

Передо мной тоже стоял выбор, какие диалоги использовать. Выбрал jQuery UI. Не знаю правильно я выбор сделал или нет, но пока вроде полет нормальный, стилизовал полностью по своему, в этом плане вполне удобная библиотека. Модальным или немодальным будет диалог, определяется заданием одного свойства, тоже нравится это.

anuarbek 13.10.2011 16:45

Белый Тигр,
Я думаю проблемы бы не возникло если бы использовали уникальные ID для каждого элемента. Дублирование ID не приветствуется( плохой тон ).

От себя, рекомендую использовать хоть какие нибудь средства отладки при разработке. Если бы к примеру использовали FireBug, то Вы бы сразу догадались об ошибке, которая отражается в консоли.

При ошибке, в Вашем случае, вывелось бы
Tried to register widget with id==myWidget but that id is already registered

Белый Тигр 13.10.2011 16:57

Цитата:

Сообщение от anuarbek (Сообщение 131065)
Белый Тигр,
Я думаю проблемы бы не возникло если бы использовали уникальные ID для каждого элемента. Дублирование ID не приветствуется( плохой тон ).

От себя, рекомендую использовать хоть какие нибудь средства отладки при разработке. Если бы к примеру использовали FireBug, то Вы бы сразу догадались об ошибке, которая отражается в консоли.

При ошибке, в Вашем случае, вывелось бы
Tried to register widget with id==myWidget but that id is already registered

Вы не верно поняли первый пост. Один и тот же ID использовался потому что работа идёт с одним и тем же виджетом. Я изначально предполагал, что если уничтожается диалог, в котором виджет, то и уничтожается сам виджет. Оказалось не так. Кстати, как раз FireBug и помог обнаружить. Это баг dojo, очень давний и вредный :(

anuarbek 13.10.2011 17:31

Извините, я точно не понял вопроса :D Да, при закрытии не уничтожаются элементы самого Dialoga. Что часто приводит к таким последствиям.


Часовой пояс GMT +3, время: 14:00.