天天看点

ActionScript 3.0中得RobotLegs应用

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中。

ActionScript 3.0中得RobotLegs应用

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中打开遇到的问题。

继续阅读