PureMVC Посредники и взгляды - создание и контроль

Я делаю приложение с flash AS3 и puremvc, способ правильно обработать медиаторы представления - это своего рода немного...

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

Сначала каждый посредник вида, который я создал, добавлял на сцену свой собственный компонент представления, и поэтому, когда нужно было "включить" показ или скрытие этого представления, это было просто - addChild и removeChild для его компонента представления.

Тем не менее, я прочитал на puremvc.org, что это не очень хорошая практика для. обойти этап (который в моем случае представлял собой viewComponent для каждого посредника - где каждое представление было добавлено - например, viewComponent.addChild(foo) b. создать свое собственное представление - что позволило мне добавить и удалить его в первую очередь),

Поэтому я перешел на рекомендованный способ - при создании каждого посредника я передаю компонент представления, которым он управляет (а не класс stage / main doc)

например.

var view:MyView = new MyView();
facade.registerMediator( new MyViewMediator( view ) );
viewComponent.addChild(view);

Так что - в этом случае - я понятия не имею, как я буду удалять / добавлять каждое представление, когда это необходимо. Я мог бы легко установить видимость внутри каждого посредника, но я как бы хотел избежать этого - предпочесть удаление, когда оно не используется для управления ресурсами...

Кто-нибудь получил какие-либо хорошие идеи, как я "должен" это делать (например, когда представление больше не нужно на сцене, удалите его - временно, и добавьте позже, когда оно понадобится?) - или я упущение какой-то точки (вполне вероятно!) и идти по этому пути неправильно? Я очень новичок в puremvc, поэтому не слишком уверен, что подхожу к этому правильно. Указатели приветствуются!

3 ответа

Я не буду притворяться экспертом в PureMVC, но мне нравится работать только для того, чтобы создать посредника только для основных областей сайта. Например, HeaderMediator, FooterMediator и ViewMediator. Затем у меня есть ApplicationMediator, который "onRegister" создаст других только что упомянутых посредников. Таким образом, я не создаю посредника для каждого отдельного представления, а "ViewMediator" управляет переключением между представлениями. Вот как бы выглядела моя функция onRegister:

override public function onRegister():void {
    var viewContainer:Sprite = viewComponent.addChild(new Sprite()) as Sprite;
    facade.registerMediator(new ViewMediator(viewContainer));

    var headerContainer:Sprite = viewComponent.addChild(new Sprite()) as Sprite;
    facade.registerMediator(new HeaderMediator(headerContainer));

    var footerContainer:Sprite = viewComponent.addChild(new Sprite()) as Sprite;
    facade.registerMediator(new FooterMediator(footerContainer));
}

Далее у меня будет ViewProxy, у которого есть пул представлений, которые сидят и ждут вызова (в массиве, словаре или векторе). Когда пришло время изменить или установить представление, я использую команду ChangeViewCommand, которая извлекает представление из ViewProxy и отправляет уведомление (например, SET_VIEW) с объектом представления в качестве тела.

Теперь ViewMediator будет обрабатывать уведомление "SET_VIEW". Если это что-то столь же простое, как removeChild(oldView) и addChild(newView), тогда я просто обработаю это в самом Mediator. Если переход необходим и требует больше кода, я буду использовать команду для обработки перехода.

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

Как упомянул FlexFiend, об этой ситуации легче заботиться в средах второго поколения (по крайней мере, в Robotlegs, я не могу говорить за другие). Это потому, что обычно вы никогда не создаете и не уничтожаете посредника в Robotlegs; вместо этого вы связываете посредник с компонентом представления, и Robotlegs постоянно наблюдает за этапом добавления и удаления компонентов представления, а также создает и уничтожает экземпляры соответствующих посредников.

Поэтому один из подходов для реализации такого рода вещей в PureMVC - это иметь StageMediator с самой сценой в качестве компонента представления и прослушивать события Event.ADDED_TO_STAGE и Event.REMOVED_FROM_STAGE. Наконец, вам понадобится система для связи компонентов представления с посредниками. Посетите https://github.com/robotlegs/robotlegs-framework/blob/master/src/org/robotlegs/base/MediatorMap.as чтобы увидеть, как это делается в Robotlegs.

На самом деле я собираюсь реализовать что-то подобное, так как я работаю над проектом, который является частью набора приложений PureMVC, но, честно говоря, если у вас нет выбора, я бы сказал, что самое простое - просто использовать Robotlegs!

Могу ли я спросить вашу мотивацию для использования PureMVC? Я не хочу начинать священную войну здесь, но одна из причин создания фреймворков второго поколения (Mate,Swiz,Robotlegs,Parsely) была из-за нелепой сложности с началом работы с архитектурой приложений RIA.

Не расстраивайтесь, однако, у новых фреймворков есть документация, поэтому легко понять и выяснить мотивацию для всех компонентов, парадигм и действующих лиц, которые вступают в игру.

Другие вопросы по тегам