Где находится "int main ()" в моем приложении Flex? - PullRequest
3 голосов
/ 08 января 2009

Ну, не буквально, конечно, но:

Я новичок во Flex и пытаюсь выяснить, куда поместить код, который я хочу запустить при запуске моего приложения. В моем примере у меня есть элемент управления деревом, определенный в разметке, и у меня есть код AS, который может заполнить его из локального файла или веб-службы. Как связать одно с другим, чтобы при создании элемента управления выполнялся код?

Все примеры, которые я нашел в документации, используют обработчики событий, т.е. е. они помещают 'creationComplete = "myInitFunction (evt)"' в открывающий тег элемента управления. Это означало бы, что я пишу небольшую клеевую функцию, которая инициализирует вещи.

Теперь, насколько я понял, разметка действительно конвертируется в классы AS внутри. Так я могу не просто определить класс, который создается движком, и поместить мой код запуска в конструктор? Может быть, даже как расширение класса Tree?

EDIT

Несколько месяцев спустя я стал намного мудрее. После попытки злоупотребить конструкторами расширенных классов компонентов мне пришлось узнать, что Flex не ожидает, что конструкторы будут делать много - конечно, не загружая данные из сети.

Объяснение жизненного цикла компонента в "Программирование Flex 3" было действительно полезным. Теперь все мои конструкторы пусты, и я переопределяю методы жизненного цикла, такие как createChildren для многих вещей, и использую события для всего, что связано с задержкой или зависит от внешних факторов, особенно от сетевых вещей.

Например, я использую creationComplete, чтобы инициировать асинхронный сетевой запрос (используя HTTPService), когда он возвращает обработчики ResultEvent и FaultEvent, ResultEvent обновляет модель данных, к которой я привязал данные своих элементов управления. Это, казалось бы, очень гибкий и прекрасно работает.

Ответы [ 3 ]

5 голосов
/ 08 января 2009

Событие creationComplete (для объекта Application) отправляется по завершении создания компонента Application. Событие applicationComplete отправляется после завершения всего приложения (макет и т. Д.) И становится видимым для пользователя (экран загрузки завершен).

Для ситуации, которую вы упоминаете - когда вы заполняете элемент управления при запуске - я бы предложил использовать событие creationComplete компонента , содержащего элемент управления, который вы хотите заполнить (дерево в случай), который звучит так, как будто это ваш компонент приложения. Обычно это хорошая практика, так как часто этот код будет зависеть от родственных компонентов того, который вы заполняете (например, компонент HTTPService).

Вы правы, что весь MXML преобразуется в AS3, который затем компилируется. Есть флаг компилятора, который сохранит сгенерированный AS3 (он будет доступен только для чтения). Вы не хотите возиться с этим. И из-за (несколько) сложной природы последовательности создания экземпляров UIComponent (конструктор, стили, макет и т. Д.) Определенно рекомендуется заполнять элементы управления в событии creationComplete (или аналогичном).

2 голосов
/ 14 января 2009

Технически говоря, int main () аналогичен конструктору класса приложения в ActionScript 3. Это означает, что для Flex является то, что каким бы ни был корневой узел файла mxml приложения (обычно mx: Application), конструктор этот класс - ваш int main ().

Но, как уже упоминалось в других постерах, вы хотите прослушать одно из событий, передаваемых mx: Application. Initialize - это хорошее место для размещения логики инициализации, загрузки файлов конфигурации или выполнения любых других необходимых действий, которые не зависят от каких-либо объектов пользовательского интерфейса или чего-либо, что еще не было создано. В противном случае creationComplete является следующим наиболее вероятным, даже если вы захотите прослушать.

Вам действительно не нужно использовать событие applicationComplete.

0 голосов
/ 08 января 2009

Вы должны обрабатывать событие запуска.

Я не очень хорошо отношусь к Flex, но согласно http://www.wietseveenstra.nl/blog/2007/02/understanding-the-flex-application-startup-event-order:

applicationComplete () отправляет события после того, как приложение было инициализируется, обрабатывается LayoutManager и добавлен на дисплей список. Это последнее событие отправляется во время подачи заявления запускать. Это позже, чем создание приложенияComplete () событие, которое отправляется раньше предварительный загрузчик был удален и приложение было прикреплено к список отображения.

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