分类:
2010-05-28 17:32:43
1.本例目的
使用消息的代码演示
消息必须先派发,再由消息处理器接收和处理。
消息的派发分为二种方式:
通过继承方式EventDispatcher方式派发
通过注入消息派发函数方式派发
消息的接收分为二种方式:
通过MessageHandle方式接收处理
通过MessageBinding方式修改属性值
消息在处理器接收之前,可以由拦截器拦截,并进行预处理:
一般应用于删除处理前的提醒,操作处理前的登录验证等
2.本例代码结构
参见 parsley学习指南例1-简单入门
3.详细说明
1.通过继承事件方式EventDispatcher方式派发消息
事件类LoginEvent必须继承Event,代码如下:
package com.test.event
{
import flash.events.Event;
public class LoginEvent extends Event
{
public function LoginEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
public static const LOGINSUCCESS:String = "loginSuccess";
public static const LOGINFAIL:String = "loginFail";
}
}
事件派发类代码如下
package com.test.service.LoginServiceImpl
package com.test.service
{
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import com.test.event.LoginEvent;
//声明loginSuccess,loginFail类型的LoginEvent事件为托管事件
[Event(name="loginSuccess",type="com.test.event.LoginEvent")]
[Event(name="loginFailed",type="com.test.event.LoginEvent")]
[ManagedEvents("loginSuccess,loginFail")]
public class LoginServiceImpl extends EventDispatcher implements ILoginService
{
public function LoginServiceImpl(target:IEventDispatcher=null)
{
super(target);
}
public function login(user:String, passwd:String):void
{
var evt:LoginEvent = new LoginEvent(LoginEvent.LOGINSUCCESS);
this.dispatchEvent(evt);//派发LoginEvent事件
}
}
}
说明:
1.由于LoginServiceImpl类会派发托管事件,则该类必须继承flash.events.EventDispatcher类
2.如果是将LoginEvent事件的所有类型都声明为托管事件,则可省略
[Event(name="loginSuccess",type="com.test.event.LoginEvent")]
[Event(name="loginFailed",type="com.test.event.LoginEvent")]
2.通过注入消息派发函数方式派发消息
这里你可以完全避开继承事件类,直接定义一个数据模型类,代码如下:
LoginMessage.as
package com.test.event
{
public class LoginMessage
{
public var user:String;
public var passwd:String;
function LoginMessage (user:String, passwd:String) {
this.user = user;
this.passwd = passwd;
}
}
}
定义一个登录事件处理类,这个类完全不用继承EventDispatcher类
LoginMessageServiceImpl.as
package com.test.service
{
import com.test.event.LoginMessage;
public class LoginMessageServiceImpl implements ILoginService
{
//parsley创建这个对象后,自动注入一个消息派发函数
[MessageDispatcher]
public var dispatcher:Function;
public function LoginMessageServiceImpl()
{
}
public function login (user:String, passwd:String) : void {
dispatcher(new LoginMessage(user,passwd));
}
}
}
BeansMessage.mxml
xmlns:spicefactory="">
import com.test.service.*;
]]>
TestMessage.mxml
主要代码如下
//当parsley框架监听到有一个类派发LoginMessage事件,
//由onLoginSuc函数进行处理。
[MessageHandler]
public function onLoginSuc(evt:LoginMessage):void{
//登录后干点啥。。。
btnlogin.label="登录成功";
Alert.show("登录成功");
}
3.通过MessageHandle方式接收处理
这是最常用的接收事件处理方式,代码如下:
[MessageHandler(selector="loginSuccess)]
public function loginhandler(evt:LoginMessage):void{
btnlogin.label="good";
}
说明:
1.对于事件类,selector的值为其常量的值
2.对于数据模型类,selector的值可以通过在代码中添加标签指定,方法如下
public class LoginMessage
{
[Selector]
public var user:String;
public var passwd:String;
function LoginMessage (user:String, passwd:String) {
this.user = user;
this.passwd = passwd;
}
}
则以后,可使用标签如下:
[MessageHandler(selector="admin)]
表示user为admin,则进行处理。
4.通过MessageBinding方式接收处理
这种方式只能将派发的消息类中的属性与目标对象的属性进行自动赋值,免去了写接收处理器的过程
TestMessageBinding.mxml
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:parsley=""
minWidth="955" minHeight="600">
import com.test.event.LoginMessage;
import org.spicefactory.parsley.flex.FlexContextBuilder;
import org.spicefactory.parsley.xml.XmlContextBuilder;
import com.test.service.ILoginService;
import mx.controls.Alert;
[Inject]
public var service:ILoginService;
[Bindable]
[MessageBinding(messageProperty="user",type="com.test.event.LoginMessage")]
public var username:String="xxxx";
private function onLoginClick():void{
this.service.login('d_yang','******');
}
]]>
说明:
1.上例中定义了一个属性username,与控件Label绑定
2.通过MessageBinding,与消息类LoginMessage的属性user进行绑定,当派发出该消息类时,Parsley框架自动修改这里的username
5.通过消息拦截器进行预处理
首先定义一个某个消息类的拦截器,再在配置文件中进行设置
DeleteItemInterceptor.as
package
{
import mx.controls.Alert;
import mx.events.CloseEvent;
import org.spicefactory.parsley.messaging.MessageProcessor;
public class DeleteItemInterceptor
{
public function DeleteItemInterceptor()
{
}
public function interceptDeleteEvent (processor:MessageProcessor) : void {
var listener:Function = function (event:CloseEvent) : void {
if (event.detail == Alert.OK) {
processor.proceed();
}
};
Alert.show("Do you really want to delete this item?", "Warning",
Alert.OK | Alert.CANCEL, null, listener);
}
}
}
beansDispater.mxml
xmlns:spicefactory="">
import com.test.service.*;
import com.test.event.LoginMessage;
import com.test.event.DeleteItemInterceptor;
]]>
测试代码:
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:parsley=""
minWidth="955" minHeight="600">
import com.test.event.LoginMessage;
import com.test.service.ILoginService;
import mx.controls.Alert;
[Inject]
public var service:ILoginService;
private function onLoginClick():void{
this.service.login('d_yang','******');
}
[MessageHandler]
public function onLoginSuc(evt:LoginMessage):void{
//登录后干点啥。。。
btnlogin.label="good";
//Alert.show();
}
]]>
说明:
当用户点击取消按钮时,MessageProcessor
将不会恢复执行,但消息处理器或绑定器将被执行。
4.结论: