PureMVC в действии (еще одно приложение с использованием фреймворка)
Более полный пример работы с фреймворком PureMVC.
Приложение состоит из двух компонентов: кнопок внизу и картинки над ними. При нажатии на разные кнопки будут показываться картинки и изменяться их статус.
Для управления картинками будут использованы медиаторы, для смены статуса - прокси.
Для начала создадим структуру папок:
1. cfacade - здесь будет находиться класс ApplicationFacade (если назвать ее facade, то почему-то возникал конфликт между путями и флекс не находил класс)
2. commands - классы, которые будут выполнять наши команды
3. mediators - классы, которые будут управлять нашими компонентами
4. proxy - классы для управления данными
5. views - визуальные компоненты
Главный файл назовем index.mxml. В него будем добавлять компоненты, образующие каркас приложения и управляемые медиаторами и прокси.
На событие creationComplete в главном Application поставим вызов функции init(), выполняющую роль инициализации нашего facade и команды STARTUP.
...
public var facade:IFacade;
public function init():void
{
facade = ApplicationFacade.getInstance();
facade.notifyObservers(new Notification(ApplicationFacade.STARTUP, this));
}
...
В ApplicationFacade (папка cfacade) зарегистрируем команды STARTUP и BUTTON_CLICK (initializeController()) и напишем функцию getInstance() для получения образца нашего ApplicationFacade.
...
override protected function initializeController():void
{
super.initializeController();
registerCommand(STARTUP, StartupCommand);
registerCommand(BUTTON_CLICK, ButtonClickCommand);
}
public static function getInstance():ApplicationFacade {
if (instance == null) instance = new ApplicationFacade();
return instance as ApplicationFacade;
}
...
В папку commands добавим две наших команды: StartupCommand и
ButtonClickCommand. В StartupCommand зарегистрируем ApplicationMediator и
ButtonMediator
...
public class StartupCommand extends SimpleCommand implements ICommand
{
public function StartupCommand()
{
super();
}
override public function execute(notification:INotification):void
{
facade.registerMediator(new ApplicationMediator(notification.getBody()));
facade.registerMediator(new ButtonMediator());
}
}
...
В ButtonClickCommand также можно добавить любые функции.
При помощи ApplicationMediator будем и управлять отображением объектов в нашем
приложении (здесь это index.mxml). Класс является расширением Mediator и
implements IMediator.
public class ApplicationMediator extends Mediator implements IMediator
Установим имя медиатора, массив с именами к картинкам и конструктор:
...
public static const NAME : String = "ApplicationMediator";
private var buttonNames:Array = new Array('krumm',
'gykach',
'ne4upara',
'oblina' );
public function ApplicationMediator(viewComponent:Object = null)
{
super(getMediatorName(), viewComponent);
}
...
Перепишем метод listNotificationInterests(), он будет возвращать массив
комманд, которые мы будем использовать в данном медиаторе:
...
override public function listNotificationInterests():Array
{
return [
ApplicationFacade.STARTUP
];
}
...
И метод handleNotification(note:INotification), здесь будем выбирать какое
действие повесить на каждую команду из списка, полученного в методе
listNotificationInterests():
...
override public function handleNotification(note:INotification):void
{
switch (note.getName())
{
case ApplicationFacade.STARTUP:
addBottles();
break;
}
}
...
В функции addBottles() добавим кнопки, зарегистрируем медиатор -
GirlMediator() - это компонент, который будет отображать картинки
(его тоже добавим в приложение) и зарегистрируем GirlProxy() для
управления данными в медиаторе. На каждую кнопку повесим событие
MouseEvent.CLICK с функцией, которая вызовет команду
ApplicationFacade.BUTTON_CLICK (она будем в списке команд,
возвращаемом в listNotificationInterests() в GirlMediator()):
...
public function addBottles():void
{
var gImage:girl = new girl();
gImage.y = 10;
gImage.x = 180;
viewObject.addChild(gImage);
gImage.im1.alpha = 0;
gImage.im2.alpha = 1;
facade.registerMediator(new GirlMediator(gImage));
facade.registerProxy(new GirlProxy());
for(var i:int=0;i<4;i++)
{
var imageBottle:buttonM = new buttonM();
imageBottle.x = i*130 + 20;
imageBottle.y = 330;
viewObject.addChild(imageBottle);
imageBottle.bImage.data = i;
imageBottle.bImage.addEventListener
(MouseEvent.CLICK, bImageClick);
imageBottle.bImage.source = "images/" + buttonNames[i] + ".swf";
}
}
private function bImageClick(event:MouseEvent):void
{
sendNotification(ApplicationFacade.BUTTON_CLICK,
event.currentTarget.data);
}
...
Также добавим функции для возвращения имени медиатора
(getMediatorName()) и возвращения объекта медиатора
(viewObject ()):
...
override public function getMediatorName():String
{
return ApplicationMediator.NAME;
}
protected function get viewObject ():index
{
return viewComponent as index;
}
...
Теперь рассмотрим компонент girl - это Canvas с двумя Image внутри,
изначально каждый Image прозрачен (alpha=0). GirlMediator по
структуре ничем не отличается ApplicationMediator и его код
можно глянуть в source.
Использование Proxy:
В GirlMediator добавим вызов метода из GirlProxy, который будет
устанавливать статус каждой картинки.
...
var girlProxy:GirlProxy = facade.retrieveProxy(GirlProxy.NAME) as GirlProxy;
var dataObject:Object = new Object();
dataObject.viewObject = viewObject.gName;
dataObject.girlIndex = data;
girlProxy.setGirlName(dataObject);
...
И код нашего прокси
...
public static const NAME:String = 'GirlProxy';
public function GirlProxy(data : Object = null)
{
super(NAME, data); // pass the cannonical name and data to the superclass
if(data != null)
setGirlName(data)
}
public function setGirlName(data:Object):void
{
switch(Number(data.girlIndex))
{
case 0:
data.viewObject.text = "Dreading";
break;
case 1:
data.viewObject.text = "Troubled";
break;
case 2:
data.viewObject.text = "Stressed";
break;
case 3:
data.viewObject.text = "Normal";
break;
}
}
...
Вот что получилось в итоге
Исходники - source, приложение - application



Comments ( posted):
Post your comment