Прослушайте конец инициализации виджета, выполненный парсером Dojo

Я разрабатываю одностраничное веб-приложение с Dojo 1.9.

Мы используем Dojo Parser для инициализации виджетов в фрагментах HTML, загружаемых с сервера в dojox.layout.ContentPane.

Прежде чем вставлять ContentPane на страницу, мы хотим дождаться, пока все виджеты полностью не завершат инициализацию.

Есть ли способ сделать это?

Я пытался добиться этого, ожидая обещания, возвращаемого ContentPane.content, но, похоже, это решается раньше.

var onParseEnd = pane.set("content", htmlText);

Я думаю, что onParseEnd разрешается сразу после того, как парсер «проанализирует» содержимое HTML, а не после завершения всех инициализаций виджета.


person sola    schedule 15.04.2015    source источник
comment
вы пробовали додзё / парсер ?. Он возвращает обещание, которое выполняется после создания экземпляров всех виджетов додзё. например require (["dojo/parser"], function ( parser ){ parser.parse( html_fragment ).then(onComplete_Callback);});   -  person frank    schedule 15.04.2015
comment
К сожалению, мы используем dojo / parser только косвенно. Мы вызываем ContentPane.set (content, htmlFragment), потому что он также выполняет Javascript, помещенный во фрагмент, присоединяет CSS и т. Д.   -  person sola    schedule 15.04.2015
comment
Согласно документации на < b> end он предлагает ключ (к сожалению, неясен), который может быть решением вашей проблемы. Документация выглядит так. С помощью параметра scriptHasHooks, Deferred instance, onLoadDeferred и метода then () вы можете имитировать dojo. готовое поведение изнутри загруженного содержимого. Альтернативой является установка scriptHasHooks = true и наличие такого содержимого в загруженном содержимом:   -  person frank    schedule 15.04.2015
comment
Вот обсуждение dojo форум, связанный с аналогичной проблемой.   -  person frank    schedule 15.04.2015
comment
Я прочитал обсуждение и поэкспериментировал с функцией onLoadDeferred ContentPane. Моя страница, похоже, выполняет инициализацию даже после разрешения onLoadDeferred в ContentPane. Помимо декларативных виджетов, я инициализирую дополнительные виджеты из кода JavaScript (помещенного во фрагмент HTML), и эти инициализации завершаются после onLoadDeferred. Правильно ли я предполагаю, что onLoadDeferred не дожидается окончания выполнения фрагментов кода JavaScript во фрагменте?   -  person sola    schedule 15.04.2015
comment
Да, это правильно. onLoadDeferred ожидает только загрузки самого содержимого (в случае установки href, а не content) и запуска parse (в случае, если потребуются какие-либо новые модули). Разрешение не задерживается для выполнения сценария, разрешенного dojox/layout/ContentPane (фактически обрабатываемого dojox/html/_base). В идеале предпочтительно организовывать JavaScript в модули и шаблонные виджеты по мере необходимости, чтобы ваш код был хорошо организован и вы не попадали во власть свободных скриптов, оцениваемых как часть смешанного контента.   -  person Ken Franqueiro    schedule 16.04.2015


Ответы (1)


Если вам нужно быть уверенным, что виджеты отрисованы, вы можете использовать domReady! для запуска события после инициализации виджетов и отрисовки: http://dojotoolkit.org/reference-guide/1.10/dojo/domReady.html

Однако событие startup () вашего виджета (-ов) обычно является лучшим вариантом, чтобы избежать «сбоев», когда контент добавляется / изменяется после того, как он был отображен браузером.

person Ted Nyberg    schedule 15.04.2015
comment
Спасибо за Ваш ответ. Я не думаю, что domReady! подходит здесь. Так как я обрабатываю фрагмент HTML (это SPA и главная страница загружалась давно), domReady! срабатывает немедленно и не будет ждать завершения инициализации виджета во фрагменте. domReady! может работать, как вы говорите, когда вы загружаете простую страницу Dojo (или главную / первую страницу SPA). - person sola; 15.04.2015
comment
Извините, пропустил SPA-часть. - person Ted Nyberg; 16.04.2015