Home | Flex and Flash | Frameworks | PureMVC | PureMVC в действии (еще одно приложение с использованием фреймворка)

PureMVC в действии (еще одно приложение с использованием фреймворка)

Font size: Decrease font Enlarge font
image

Более полный пример работы с фреймворком 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 comment

Please enter the code you see in the image:


  • email Email to a friend
  • print Print version
  • Plain text Plain text
Tags
No tags for this article
Rate this article
0