关联View与Controller
View与Controller关联后,Controller就能监听到View触发的ViewEvent事件。一个Controller对象可以关联多个View对象,但是一个View对象只能关联一个Controller对象
View包含一个名称为”controller”的setter方法,只要把Controller对象作为属性值设置给此属性,那么View与Controller即关联在一起。View一旦与某个Controller对象关联在一起,就不能再与另外的Controller对象相关联,所以一般我们会在Controller的初始化方法创建View对象并与当前Controller对象关联,如下:
代码
public class HelloController extends Controller
{
private var _view:HelloView;
public function HelloController()
{
super();
}
/**此方法由构造函数调用,可以在此方法里创建并初始化View*/
override protected function initController():void{
_view=new HelloView();//創建_view對象
_view.controller=this;//指定_view對象的控制器為當前的Controller
}
}
View与Controller关联后,当View触发ViewEvent事件时,会调用Controller的handleViewEvent()把触发时创建的ViewEvent事件对象交给Controller处理。所以自定义控制器类可以覆盖handleViewEvent()处理ViewEvent事件。但是不推荐这样做,而是推荐使用Controller的默认实现。
Controller的handleViewEvent()默认实现约定如下:
如果传入的ViewEvent对象的name属性值以“#”开头,那么会调用与其对应的Controller的public方法,并且把ViewEvent对象的body属性值作为方法参数值
如果传入的ViewEvent对象的name属性值以“$”开头,那么会设置与其对应的Controller的public属性(包括getter/setter),并且把ViewEvent对象的body属性值作为此属性值
以下代码演示了点击View里的按钮后,通过触发ViewEvent事件去调用Controller的方法或设置Controller的属性的方式,如下:
View代码
<?xml version="1.0" encoding="utf-8"?>
<sdp:View xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="100%" height="100%" xmlns:sdp="http://www.chinasie.com/sdp">
<mx:Script>
<![CDATA[
import com.sdp.data.DynamicObject;
/***********以下为业务方法***********/
[Bindable]
public var vo:DynamicObject;
]]>
</mx:Script>
<mx:Button x="178" y="50" label="submit" click="dispatch(this,'#handleViewSubmit',[vo])"/>
<mx:Button x="10" y="158" label="设置Controller的name属性值" click="dispatch(this,'$name',Math.random())"/>
<mx:Button x="10" y="188" label="调用Controller的sayHello()方法" click="dispatch(this,'#sayHello')"/>
</sdp:View>
Controller代码
/**此方法由构造函数调用,可以在此方法里创建并初始化View*/
override protected function initController():void{
//创建并初始化MasterView
_masterView=new MasterView();
//把MasterController设置给MasterView,这样MasterController就能监听到
//MasterView触发的ViewEvent事件
_masterView.controller=this;
}
public var name:String; //name的值会变为 Math.random()产生的值
public function sayHello():void{
Alert.show("Hello,"+name); }//调用方法
/**处理MasterView提交事件*/
public function handleViewSubmit(vo:DynamicObject):void{
Alert.show(vo+"");
}
//view页面点击了submit按钮后,产生一个ViewEvent,由于在controller初始化的时候已经把Controller给了View,所以它就能监听到产生的ViewEvent(这里是HandlerViewSubmit)
如前所述,在View显示/移除前/后会分别触发4个ViewEvent事件,Controller默认实现了监听此事件的4个方法,子类可以覆盖这些方法添加代码,如下:
代码
/**处理View显示前事件*/
override public function beforeViewShow(view:IView,container:DisplayObjectContainer,
event:IViewEvent):void{
//以下代码可以取消显示View
//event.preventDefault();
}
/**处理View显示后事件*/
override public function afterViewShow(view:IView,container:DisplayObjectContainer):void{}
/**处理View移除前事件*/
override public function beforeViewRemove(view:IView,container:DisplayObjectContainer,
event:IViewEvent):void{
//以下代码可以取消移除View
//event.preventDefault();
}
/**处理View移除后事件*/
override public function afterViewRemove(view:IView,container:DisplayObjectContainer):void{}
View与Controller关联后,Controller就能监听到View触发的ViewEvent事件。一个Controller对象可以关联多个View对象,但是一个View对象只能关联一个Controller对象
View包含一个名称为”controller”的setter方法,只要把Controller对象作为属性值设置给此属性,那么View与Controller即关联在一起。View一旦与某个Controller对象关联在一起,就不能再与另外的Controller对象相关联,所以一般我们会在Controller的初始化方法创建View对象并与当前Controller对象关联,如下:
代码
public class HelloController extends Controller
{
private var _view:HelloView;
public function HelloController()
{
super();
}
/**此方法由构造函数调用,可以在此方法里创建并初始化View*/
override protected function initController():void{
_view=new HelloView();//創建_view對象
_view.controller=this;//指定_view對象的控制器為當前的Controller
}
}
View与Controller关联后,当View触发ViewEvent事件时,会调用Controller的handleViewEvent()把触发时创建的ViewEvent事件对象交给Controller处理。所以自定义控制器类可以覆盖handleViewEvent()处理ViewEvent事件。但是不推荐这样做,而是推荐使用Controller的默认实现。
Controller的handleViewEvent()默认实现约定如下:
如果传入的ViewEvent对象的name属性值以“#”开头,那么会调用与其对应的Controller的public方法,并且把ViewEvent对象的body属性值作为方法参数值
如果传入的ViewEvent对象的name属性值以“$”开头,那么会设置与其对应的Controller的public属性(包括getter/setter),并且把ViewEvent对象的body属性值作为此属性值
以下代码演示了点击View里的按钮后,通过触发ViewEvent事件去调用Controller的方法或设置Controller的属性的方式,如下:
View代码
<?xml version="1.0" encoding="utf-8"?>
<sdp:View xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="100%" height="100%" xmlns:sdp="http://www.chinasie.com/sdp">
<mx:Script>
<![CDATA[
import com.sdp.data.DynamicObject;
/***********以下为业务方法***********/
[Bindable]
public var vo:DynamicObject;
]]>
</mx:Script>
<mx:Button x="178" y="50" label="submit" click="dispatch(this,'#handleViewSubmit',[vo])"/>
<mx:Button x="10" y="158" label="设置Controller的name属性值" click="dispatch(this,'$name',Math.random())"/>
<mx:Button x="10" y="188" label="调用Controller的sayHello()方法" click="dispatch(this,'#sayHello')"/>
</sdp:View>
Controller代码
/**此方法由构造函数调用,可以在此方法里创建并初始化View*/
override protected function initController():void{
//创建并初始化MasterView
_masterView=new MasterView();
//把MasterController设置给MasterView,这样MasterController就能监听到
//MasterView触发的ViewEvent事件
_masterView.controller=this;
}
public var name:String; //name的值会变为 Math.random()产生的值
public function sayHello():void{
Alert.show("Hello,"+name); }//调用方法
/**处理MasterView提交事件*/
public function handleViewSubmit(vo:DynamicObject):void{
Alert.show(vo+"");
}
//view页面点击了submit按钮后,产生一个ViewEvent,由于在controller初始化的时候已经把Controller给了View,所以它就能监听到产生的ViewEvent(这里是HandlerViewSubmit)
如前所述,在View显示/移除前/后会分别触发4个ViewEvent事件,Controller默认实现了监听此事件的4个方法,子类可以覆盖这些方法添加代码,如下:
代码
/**处理View显示前事件*/
override public function beforeViewShow(view:IView,container:DisplayObjectContainer,
event:IViewEvent):void{
//以下代码可以取消显示View
//event.preventDefault();
}
/**处理View显示后事件*/
override public function afterViewShow(view:IView,container:DisplayObjectContainer):void{}
/**处理View移除前事件*/
override public function beforeViewRemove(view:IView,container:DisplayObjectContainer,
event:IViewEvent):void{
//以下代码可以取消移除View
//event.preventDefault();
}
/**处理View移除后事件*/
override public function afterViewRemove(view:IView,container:DisplayObjectContainer):void{}