Показать сообщение отдельно
Старый 03.12.2012, 16:36
tofflife вне форума Посмотреть профиль Отправить личное сообщение для tofflife Найти все сообщения от tofflife
  № 1  
Ответить с цитированием
tofflife

Регистрация: Jul 2009
Сообщений: 95
По умолчанию Отсутствие инициализации inspectable props на главной сцене

Добрый день коллеги! На днях обнаружился весьма любопытный момент в работе FlashPlayer версии 10.
В связи с этим решил создать тестовый упрощенный проектик, отражающий суть проблемы.

Имеется 5 swf:

Main.swf - загружает в себя ClassLibrary.swf, GUI1.swf и GUI2.swf
ClassLibrary.swf - библиотека с классами, загружается в main.swf первой
GUI1.swf - SWF, содержащая в себе компонент, текст которого инициализируется надписью "GUI1"
GUI2.swf - SWF, содержащая в себе компонент, текст которого инициализируется надписью "GUI2"
Component.swf - содержит в себе компонент, который импортируется в GUI1.swf и GUI2.swf.
По умолчанию его текст устанавливается в значение TEXT.
Вот объявление его отображения:
Код AS3:
[Inspectable(type="String", defaultValue="")]
		public function get text():String{return textField.text;}
		public function set text(txt:String):void{
			textField.text = txt;
		}
Все библиотеки грузятся в одном домене:
Код AS3:
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
			loder.load(new URLRequest(path), context);
В идеале, когда запускаем главную флешку Main.swf, то видим в ней 2 надписи:
GUI1 GUI2.

Но в результате получаем GUI1 и TEXT!



Gui1.swf и GUI2. swf имеют 2 класса с АБСОЛЮТНО одинаковым кодом! Их отличие лишь в сцене: в первой swf на сцене компоненту задано значение "GUI1", во второй - "GUI2".

Но есть одно "НО".

Поскольку проект может быть большим и с огромным количеством swf, флешка ClassLoader.swf импортирует в себя абсолютно все классы, которые есть во всех swf. Дело в том, что несколько swf могут импортировать какой-нибудь общий класс, при изменении которого придется компильнуть ВСЕ swf, которые используют этот класс, что весьма накладно, да и не всегда можно понять, в каких swf конкретный класс используется.
А вот если компильнуть только одну swf, то получится, что в одной swf бинарный код актуальный, а в другой - нет и в таком случае, flashPlayer приминяет код на весь проект только из ПЕРВОЙ загруженной swf, что приводит вообще к непредсказуемым результатам.
Поэтому и было принято решение компилировать весь код в одну swf - ClassLoader.swf и загружать её в main.swf что бы, если придется менять что-то в одном общем классе, используемом в большом количестве swf-ок, компилировать только одну swf.

ТО, что в результате этой схемы мы видим GUI1 и TEXT, результат того, что класс GUI2Class импортирован в ClassLibrary, а GUI1Class - нет. По факту, у флешки GUI2.swf на главной сцене не вызывается сеттер у компонента.

Прошу прощения за бородатось сего вопроса, поэтому прикрепляю ещё и архив с проектом.
TEST - loader.zip

Вопрос: как сделать так, что бы documentClass's компилировались в ClassLibrary, но при этом в соотвестующих им флешках у всех компонентов вызывался их сеттер?


Последний раз редактировалось tofflife; 03.12.2012 в 16:58.