петрушка и swfloader: известное распространение домена - PullRequest
0 голосов
/ 28 февраля 2012

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

это код для вставки:

<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, Parsley выдает эту знаменитую ошибку:

ReferenceError: Specified ApplicationDomain does not contain the class _B_mx_managers_SystemManager

, даже если представление, содержащее код для встраивания, не настроено на Parsley (и не имеет тега <Configure/>).

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

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

Ответы [ 2 ]

1 голос
/ 30 марта 2012

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

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

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

Решение состоит в том, чтобы остановить эти события, попадающие в контекст петрушки приложения оболочки.Вы можете сделать это несколькими способами, например, вы можете просто добавить прослушиватели для событий и остановить их распространение.Однако это будет означать, что вам придется добавить слушателей для всех событий Parsley, которые могут измениться в будущем.Лучшее решение состоит в том, чтобы создать новый контекст в родительском объекте вашего SWFLoader, у которого есть autowireFilter, который возвращает 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 голосов
/ 03 апреля 2012

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

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

...