ActionScript 3.0中得RobotLegs应用
-
- 简介
- Context
- Mediator
- Model
- 注意事项
简介
MVC在大多数眼中是一种设计模式,有经验得码农完全可以按照自己对MVC得理解将MVC思想应用到实际项目中而不依赖任何MVC框架。
大名鼎鼎的PurMVC是我日常项目中使用最多的,PurMVC强调分离,适用性很强,但是比较庞大,在开发一些小玩意儿得时候总是感觉杀鸡在用宰牛刀。
还有一些如
Cairngorm:限制太多,完全按照设计好的流程走,只能用它得model去更新对应的view,在实际项目应用中比较死板,涉及到多view联动会比较混乱;
Mate:更像为Flex定制的,用Flex就很简便;
RobotLegs:采用和Spring类似的注入方式,这里叫做依赖注入(Dependency Injection),好处是比pureMVC更方便,所以一些人会认为Robotlegs比pureMVC好用
初期得Robotlegs是专为as3而设计的ActionScript 3 robotlegs-framework,现在同样适用于C#项目C# robotlegs-sharp-framework中。
Context
Context 是学习 Robotlegs 的核心,一个Context相当于一个框,具体框里装啥内容你自己决定,但是接口使用方法是固定得,一般大型项目多个Moudle得情况下需要多个Context。
CommandMap 类的依赖注入
为了执行随后被映射得Command,需要先给commandMap提供一个可执行得类和事件类型
// Map some Commands to Events
commandMap.mapEvent(ContextEvent.STARTUP_COMPLETE, CreateBallCommand, ContextEvent, true);
commandMap.mapEvent(HelloFlashEvent.BALL_CLICKED, CreateBallCommand, HelloFlashEvent );
MediatorMap 类的依赖注入
mediators 映射到 view 方便后续得注入,这也是RobotLegs最方便得地方
mediatorMap.mapView(Ball, BallMediator);
mediatorMap.mapView(Readout, ReadoutMediator);
Mediator
作为中介,接收发送view得事件,并且改变view得显示,我接触得框架得Mediator所需要做得工作似乎都大同小异。
package org.robotlegs.demos.helloflash.view
{
import flash.events.MouseEvent;
import org.robotlegs.demos.helloflash.controller.HelloFlashEvent;
import org.robotlegs.demos.helloflash.model.StatsModel;
import org.robotlegs.mvcs.Mediator;
public class BallMediator extends Mediator
{
[Inject]
public var view:Ball;
[Inject]
public var statsModel:StatsModel;
public function BallMediator()
{
// Avoid doing work in your constructors!
// Mediators are only ready to be used when onRegister gets called
}
override public function onRegister():void
{
// Listen to the view
eventMap.mapListener(view, MouseEvent.CLICK, onClick);
// Listen to the context
eventMap.mapListener(eventDispatcher, HelloFlashEvent.BALL_CLICKED, onSomeBallClicked);
}
protected function onClick(e:MouseEvent):void
{
// Manipulate the model
statsModel.recordBallClick();
// Dispatch to context
eventDispatcher.dispatchEvent(new HelloFlashEvent(HelloFlashEvent.BALL_CLICKED));
}
protected function onSomeBallClicked(e:HelloFlashEvent):void
{
// Manipulate the view
view.poke();
}
}
}
Model
封装数据,并提供数据访问,自不必说,Model你就是干这个的。
package org.robotlegs.demos.helloflash.model
{
import org.robotlegs.mvcs.Actor;
public class StatsModel extends Actor
{
protected var _ballClickCount:int;
public function StatsModel()
{
_ballClickCount = 0;
}
public function recordBallClick():void
{
_ballClickCount++;
}
public function get ballClickCount():int
{
return _ballClickCount;
}
}
}
注意事项
框架使用很简单,主要就是正确使用Injectors就可以了,绑定正确得Mediator到对应得View,如果映射没有触发,那就去查command。
RobotLegs的Demo原本是一个web项目,由于大多浏览器当前已不在支持直接访问本地flash,为了方便,这里改成了桌面的air项目robotLegs-as3,如果遇到AIR SDK问题可参考Flash Builder 4.6桌面项目在Flash Builder 4.7中打开遇到的问题。