Методы управления жизненным циклом

Ниже дается упрощенное описание жизненного цикла с кратким изложением того, что делает каждый из методов управления жизненным циклом класса _Widget. Это упрощенное описание начинается с метода preamble, так как вообщето весьма редко возникает потребность переопределить метод postscript или create (такая потребность может возникнуть, если вы задумаете разработать свои собственные методы управления жизненным циклом, вместо того чтобы использовать стандартные). Расширенные примеры, которые более подробно охватывают каждый метод, следуют ниже в этой же главе.

preamble (наследуется от dojo.declare)
Метод preamble обеспечивает возможность манипулирования аргументами, прежде чем они будут переданы функции constructor. Если вы собираетесь переопределить метод preamble, вы должны знать, что ему передаются те же самые аргументы, которые обычно передаются методу constructor, и все, что возвращает метод preamble, передается методу constructor. Этот метод имеет довольно узкую область применения и используется гораздо реже остальных методов управления жизненным циклом, таких как postCreate.
constructor (наследуется от dojo.declare)
Это самый первый метод, который вам придется переопределять, чтобы назначить свою логику процесса создания диджита.


Обычно в методе constructor выполняются две операции. Одна из них заключается в инициализации свойств диджита, имеющих сложный
тип. (В главе 10 уже говорилось, что в случае встроенного объявления свойств, имеющих сложный тип, такой как объект или список, такие свойства становятся общими для всех экземпляров класса.)

Другая операция заключается в создании любых дополнительных свойств, на которые опираются остальные методы управления жизненным циклом.

postMixInProperties (наследуется от dijit._Widget)
Этот метод вызывается сразу после того, как будет произведен обход дерева наследования и выполнено подмешивание к классу всех предков. То есть имя метода postMixInProperties буквально указывает на момент времени, когда все свойства виджета будут смешаны в конкретном экземпляре объекта. Таким образом, к тому моменту, когда будет вызван этот метод, ваш класс получит полный доступ ко всем унаследованным свойствам и сможет выполнить с ними некоторые манипуляции, перед тем как диджит появится на экране. Вскоре будет показан пример диджита, который воспроизводится из шаблона, где будет продемонстрировано, как можно использовать этот метод для изменения или получения метокзаполнителей (определяемых в виде ${someWidgetProperty}), присутствующих в разметке шаблона.
buildRendering (наследуется от dijit._Widget)
В реализации класса _Widget этот метод просто устанавливает значение внутреннего свойства _Widget.domNode, записывая в него ссылку на фактический элемент DOM, чтобы диджит физически стал частью страницы.


Учитывая, что этот метод выполняется сразу вслед за методом postMixInProperties, должно стать понятно, почему именно метод postMixInProperties используется для изменения шаблона виджета.

Вскоре вы познакомитесь с еще одним основополагающим классом в библиотеке Dijit – с классом _Templated, который переопределяет этот метод для выполнения бесчисленного множества мелочей, связанных с получением и обработкой шаблона диджита. Наконец, следует отметить, что сразу после вызова метода buildRendering сам диджит добавляется в объект Dojo, осуществляющий управление диджитами, чтобы диджит мог быть корректно уничтожен при явном вызове метода деструктора или при выгрузке страницы. В некоторых броузерах случаются утечки памяти, которые становятся значимыми при работе с долгоживущими приложениями, а отслеживая виджеты с помощью централизованного реестра, Dojo позволяет смягчить эту проблему. Необходимость переопределять этот метод возникает крайне редко – чаще используется реализация по умолчанию, имеющаяся в классе _Widget или _Templated.
postCreate (наследуется от dijit._Widget)
Этот метод вызывается сразу же, как только диджит будет создан и его визуальное представление появится на странице, поэтому его можно использовать для выполнения любых действий, которые невозможны или неуместны до данного момента.


Обратите особое внимание, что такие операции, как применение стиля или изменение местоположения диджита на экране, должны выполняться до того, как диджит станет видимым – в методе postMixInProperties.

Выполнение этих действий в методе postCreate может иногда вызывать резкие изменения на экране, потому что производиться они будут, когда диджит уже видим. Такого рода ошибки бывает очень сложно отыскать и исправить, если забыть фундаментальные различия между методами postMixInProperties и postCreate. Кроме того, обратите внимание, что если диджит содержит какиелибо дочерние диджиты, то будет небезопасно обращаться к ним в этом методе. Чтобы обезопасить попытки обращения к дочерним диджитам, производите их в методе управления жизненным циклом startup. Чтобы обезопасить попытки обращения к другим, не дочерним виджетам, дождитесь окончания загрузки страницы и производите эти попытки в функции addOnLoad.
startup (наследуется от dijit._Widget)
Этот метод вызывается автоматически, как только будут созданы сам виджет и все его дочерние виджеты, определенные в разметке. Это, к тому же, первый метод, где можно безопасно обращаться к дочерним виджетам. Эту задачу часто пытаются решить в методе postCreate, что приводит к неустойчивости в работе, причины которой достаточно сложно определить и исправить.


Для виджетов, создаваемых программно и содержащих дочерние виджеты через отношение имеет, метод startup необходимо вызывать вручную, после того как вы будете уверены, что все дочерние виджеты созданы и доступны. Причина, по которой этот метод придется вызывать вручную – в случае создания виджета программным способом, состоит в том, что нет смысла продолжать работать с размерами и отображением виджета, пока не будут добавлены все дочерние виджеты. (В противном случае это может приводить к неправильной работе с самого начала.) Этот метод является последним методомзаглушкой, который можно переопределять при реализации собственной логики создания диджита.
destroyRecursive (наследуется от dijit._Widget)
Этот метод является обычным деструктором, который вызывается, чтобы уничтожить диджит и все его дочерние диджиты. В ходе своей работы этот метод вызывает метод uninitialize, который является главным кандидатом на переопределение для выполнения нестандартных операций. Не переопределяйте метод destroyRecursive. Реализуйте свои операции в методе uninitialize и вызывайте этот метод (так как он не вызывается автоматически), чтобы он смог позаботиться обо всем остальном.
uninitialize (наследуется от dijit._Widget)
Переопределяйте этот метод для реализации собственной логики поведения диджита при его уничтожении.


Например, этот метод можно было бы использовать для выполнения обращений к серверу, чтобы сохранить состояние сеанса или выполнить заключительные манипуляции с деревом DOM. Этот метод является типичным местом, которое должно использоваться всеми диджитами для выполнения действий по уничтожению.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
Анатомия библиотеки Dijit
Быстрое создание прототипов виджетов в разметке
Ваш первый диджит: HelloWorld
Диджит HelloWorld (Дубль 1: Основа)
Диджит HelloWorld (Дубль 2: Изменение шаблона)

Вернуться в раздел: Dojo / Анатомия Dijit и жизненный цикл