#actionscript-3 #puremvc
#actionscript-3 #puremvc
Вопрос:
Я создаю флэш-кампанию, которая будет загружена в клиентскую среду, которую я не контролирую. Фреймворк уже загрузил несколько параметров, таких как locale, шрифты и copy, и передаст их в мой swf-файл при инициализации.
Поскольку размер моего swf-файла (назовем его оболочкой) ограничен, он, в свою очередь, отобразит предварительный загрузчик для конкретной кампании, а затем загрузит другой swf-файл (назовем его campaign) с остальной частью сайта.
Оболочка и кампания будут модулями PureMVC. Оболочка создаст несколько прокси и заполнит их данными, переданными из фреймворка (константы локали, шрифты и т. Д.), Перед загрузкой в кампанию.
Когда кампания загружена, ей тоже понадобятся локали, шрифты и т. Д. Итак, мой вопрос: каков наилучший способ передать эти данные в модуль campaign из модуля оболочки?
- Я мог бы создать те же прокси в модуле campaign и снова загрузить данные, которые будут кэшироваться, но это, очевидно, кажется неправильным.
- Я исследовал использование утилиты pipes, но в моем случае это кажется излишним, поскольку связь будет односторонней и произойдет только один раз во время инициализации кампании.
- Было бы «нормально» с точки зрения шаблона проектирования передавать прокси в метод инициализации модуля campaign, а затем регистрировать эти прокси в команде запуска модуля campaign? Это кажется неправильным, поскольку эти прокси имеют ссылки на фасад моего приложения-оболочки через имена уведомлений. Было бы нормально, если бы я переместил имена уведомлений в некоторый класс «NotificationConstants», который могут использовать оба модуля?
- Я мог бы создать аналогичные прокси в модуле campaign, но на этот раз заполнить их объектами данных из моих старых прокси, переданных ранее упомянутому методу инициализации? Спонтанно это кажется лучшим способом сделать это, поскольку объекты данных не имеют никаких ссылок на мой модуль оболочки, но «старые» прокси имеют..
Ответ №1:
Решение, которое я обычно использую, — создать интерфейс:
interface Campaign {
function set campaignDetails(value:CampaignDetails):void;
//...
}
Модуль campaign должен реализовывать этот интерфейс — в реализации я рекомендую вам использовать другой прокси в модуле, чтобы избежать дублирования уведомлений и ссылок.
Когда оболочка готова к загрузке модуля, она просто должна:
if (module is Campaign)
{
(module as Campaign).campaignDetails = ...;
}
Я уверен, что не говорю вам ничего нового. Вам просто нужно убедиться, что знакомство между оболочкой и модулем только на уровне интерфейса. Затем вы просто передаете данные и оставляете модуль MVC core обрабатывать их независимо от оболочки.
Комментарии:
1. Спасибо, однако использование разных прокси для одного и того же типа данных, похоже, нарушает классическое правило «не повторяйся», поэтому я решил создать «общий» пакет для этих прокси и помещать уведомления в класс NotificationConstants. Таким образом, модули оболочки и campaign будут иметь ссылки только на общий пакет. В этот пакет я также добавляю интерфейс ICampaign, как вы предлагаете, с соответствующими методами для передачи прокси.
2. О, только что нашел это, ознакомьтесь с последним абзацем. Я думаю, имеет смысл, что прокси не должны ссылаться на какой-либо другой класс в проекте. puremvc.org/content/view/93/188