2012-02-28 5 views
0

У нас есть два приложения (не модули, два независимых приложения!): A и B. оба управляются Parsley, и мы хотели бы встроить B в A с использованием SWFLoader (но, и я подчеркиваю, что мы не хотим «подключать» эти приложения с помощью Parsley, мы просто хотим сделать обычное встраивание Flash).петрушка и swfloader: известное распространение домена

, который встраивать код:

<fx:Script> 
<![CDATA[ 
    [Bindable] 
    private var childDomain:ApplicationDomain = 
     new ApplicationDomain(ApplicationDomain.currentDomain); 

]]> 
</fx:Script> 

<mx:SWFLoader width="100%" height="100%" source="B.swf" 
    complete="initNestedAppProps(SWFLoader(event.currentTarget).content);" 
    loaderContext="{new LoaderContext(false, childDomain, SecurityDomain.currentDomain)}"/>   

и она работает, когда я вставлять B в фиктивном приложении без петрушка.

однако, когда я копировать-вставить, что вставлять код в живом приложении A, петрушка бросает эту известную ошибку:

ReferenceError: Specified ApplicationDomain does not contain the class _B_mx_managers_SystemManager

даже если представление, которое содержит вложение коды не петрушка сконфигурированные (и Безразлично 't есть <Configure/> тег).

Я не могу опубликовать это на форумах Parsley, к сожалению, и googling не помог, так как кажется, что люди слишком часто не внедряют приложения.

, так что вопрос в том, почему эта ошибка происходит (Петрушка не должна заботиться о вещах во встроенном приложении, не так ли?) И как можно сказать Петрушке правильно использовать мой childDomain?

+0

У вас есть прогресс? У меня такая же проблема, пока нет решения. – robmcm

ответ

1

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

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

Что происходит, так это то, что ваше вспомогательное приложение активирует события, которые обрабатываются вашими оболочками (или приложениями оболочки/загрузчика), однако, когда parsley затем пытается отразить этот объект, он не может, поскольку объект doesn ' t в домене приложения.

Решение состоит в том, чтобы остановить появление этих событий в контексте петрушки приложения оболочки. Вы можете сделать это несколькими способами, например, вы можете просто добавить слушателей к событиям и прекратить их распространение. Однако это означало бы, что вы должны добавить слушателей для всех событий Parsley, которые могут измениться в будущем. Лучшим решением является создание нового контекста в родительском элементе SWFLoader, у которого есть autwireFilter, который возвращает ViewAutowireMode.NEVER для переданных ему объектов displayObject.

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

См: org.spicefactory.parsley.core.view.impl.DefaultViewAutowireFilter org.spicefactory.parsley.core.builder.impl.DefaultCompositeContextBuilder http://opensource.powerflasher.com/jira/browse/PSL-587

Надеется, что это помогает.

0

вышеуказанный ответ правильный.

В нашем случае я решил проблему, написав гибкий модуль и используя ModuleLoader вместо SWFLoader, который прекрасно интегрирован с петрушкой.