Мы недавно обновили проект с Dojo 1.5 до 1.6 [для базовой поддержки IE9] и сломал один из наших виджетов. У нас есть диалоговый виджет [dijit.Dialog] с другим виджетом внутри него [любой виджет здесь будет производить то же самое поведение], ожидаемое поведение для внутреннего виджета, который будет помещен в contentNode виджета диалога, и каждая из их точек привязки будет доступно через основной виджет.
Этого не происходит, вместо этого мы находим только точку подключения диалога. Более подробная информация ниже:
Мы делаем что-то подобное в шаблоне нашего основного виджета:
<div dojoType="dijit.Dialog" dojoAttachPoint="dia_widget"
autofocus="true" draggable="false" open="false" preventCache="true">
<div dojoType="dijit.form.ValidationTextBox" doLayout="false" dojoAttachPoint="val_widget">
</div>
</div>
Это предоставляет нам родительский виджет [main_widget] с двумя точками прикрепления: dia_widget и val_widget, к которым можно получить доступ в основном виджете [после функции buildRendering ()], вызвав this.dia_widget
и this.val_widget
соответственно.
После обновления до 1.6.0 все пошло не так.
Я предполагаю, что когда анализируется диалоговый виджет, он удаляет domNode своего содержимого в свой новый containerNode. Когда корневому узлу назначены точки присоединения, поскольку domNode больше не доступен, он не будет добавлен.
Я отлаживал, и, как я вижу, buildRendering()
вызывает _attachTemplateNodes()
в dijit / _Templated.js. Это перебирает узлы в виджете, ищет их атрибут dojoattachpoint
и помещает их в атрибут _attachpoints
виджета.
Первый цикл состоит из двух узлов [наши dia_widget и val_widget]. В этот момент он начинает анализировать каждый узел в отдельности, начиная с вызова buildRendering () для dia_widget и находя точки присоединения всех его дочерних элементов.
В какой-то момент здесь дом main_widget изменяется, чтобы включить проанализированный / обработанный dia_widget. Затем цикл возвращается к основному узлу _attachTemplateNodes()
call, где он видит dia_widget только как дочерний узел, потеряв запись val_widget. Поскольку узел не найден, он никогда не добавляется в качестве точки присоединения в main_widget, и мы не можем получить к нему доступ по линии.
Я надеюсь, что это не слишком запутанно, чтобы следовать, я новичок в Dojo, и погоня за кодом в firebug не была самым забавным опытом в мире, поэтому я написал вещи, так как они имеют смысл мне.
Мне интересно, почему поведение меняется от 1,5 до 1,6, это просто функция / параметр, который я должен передать диалогу, чтобы он вел себя так же, как раньше? Это ошибка в том, как я создаю вложенный виджет? Это [известная?] Ошибка в самом додзё?
Спасибо
Vic