![]() |
Состоятельность конструкции if (stage) initialize();
Почти всегда использую конструкцию:
Код AS3:
И вот задался вопросом, а в чем вообще смысл верхней строки в данном случае? Ведь очевидно же, что сразу после создания экземпляря stage всегда = null. Или все-таки бывают те редкие случаи, когда "if" блок может сработать? |
Если флэшка не подгружена в другую - сработает.
|
Если флешка загружается, то у нее не будет stage, даже если лоадер добавлен в него. Если флешка stage owner (самая первая исполняемая FP), stage будет присутствовать, но все равно для нее будет диспатчиться ADDED_TO_STAGE. Я отказался от условия и использую только одну строку.
Код AS3:
|
Цитата:
Цитата:
|
На самом деле, даже если stage есть у документ класса когда он стартует отдельно, событие addedToStage будет задиспатчено чуть позже. Т.е. по идее можно писать только addEventListener, но не стоит так делать ибо идеологически это косяк. Вообще присутствие стейджа в конструкторе док класса - бага эдоб, его там быть не должно. Но видимо они посчитали что для новичков так будет проще. Чем добавили несказанное количество геморроя желающим подгрузить внутрь себя отображаемые флешки динамически.
|
Aquahawk, я ничего не понял.
С одной стороны говорите, что наличие stage в конструкторе -- это баг. С другой, что инициализация по addedToStage -- это идеологический косяк. Как же нам сделать правильно? |
В том смысле что писать просто
Код AS3:
|
Цитата:
Я сделал прямо противоположный вывод по двум причинам. 1) Если наличие stage в конструкторе -- это баг, значит его могут поправить и if точно не нужен. 2) Каждый DO генерирует событие ADDED_TO_STAGE, значит if не нужен. |
Цитата:
Идеологии бывают разные. Кто-то считает что надо использовать this, кто-то выравнивает все типы переменных табуляцией и т.п. Это не говорит о том, что какой-то вариант правильный, а какой-то нет. |
Эдоб решила что даст ссылку на stage для документ класса в конструкторе. На самом деле stage доступен в конструкторе ещё у объектов которые положены в ide кадр и им присвоен класс, у них тоже stage есть в конструкторе, тем не менее событие addedtostage отправляется уже после того как stage доступен. Более того если такую флешку динамически подгрузить то в ней stage не будет в конструкторах объектов лежащих на первом кадре и у документ класса. Всё это смахивает на костыльность. Просто при создании самой средой(объекты на кадрах и док класс) происходит немного магии, а именно дисплейобджект конструируется раньше чем ваш конструктор, потом этот дисплейобджект добавляется на сцену, и только потом уже запускается ваш конструктор. Это можно пронаблюдать если сделать в ide дисплейобджект а в конструкторе написать такой код
Код AS3:
|
Очень занимательно. Все-таки хотелось бы получить ответ на свой вопрос.
|
Ответ: То что событие addedToStage отправляется уже после того как stage доступен - баг.
Для ухода от него применяется костыль с ифом, т.к. неизвестно как эдоб этот баг может поправить(хотя ясно что он допущен намеренно и исправлен не будет). Для разрешения сего парадокса можно либо перестать отправлять событие когда стейдж уже есть в конструкторе, либо убрать стейдж до появления события. при обоих способах решения вариант с ифом будет корректно работать. Вот потому я и считаю что так писать правильно |
Да хрена два они будут "фиксить" это. Они даже задержку в изменении width/height после задания scrollRect отказались фиксить, чтобы сохранить обратную совместимость. Пишите как показал dimarik без if и не парьтесь.
|
Я пишу с if и не парюсь.
|
Я тоже не парюсь, но зачем нужна лишняя писанина если и без этого все работает. После этой темы пишу без if
|
| Часовой пояс GMT +4, время: 16:41. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.