Flex事件懂得
只有事件发送者才能侦听事件”,这句话的意思是dispatchEvent对象与addEventListener对象都必须是同一个实例,所发送的事件类型可以是系统自定义的事件也可以是任一类的静态常量。
在自定义事件派发与侦听过程中需要注意事件的流程,我们先要做的是建立侦听器(addEventListener),再发送事件,程序在执行dispatchEvent之后立马通知已注册事件侦听的所有对象,如果addEventListener语句在dispatchEvent之后,那么注册该侦听器的对象将无法接到通知。这一点在接收和发送数据时容易出问题,有时候很难弄明白dispatchEvent语句究竟是在什么时候执行的。
Settings.getInstance().loadSettings("customAs/xml/file.xml");
Settings.getInstance().addEventListener(Settings.INIT, onSettingsInit);
public function loadSettings(url:String):void {
var urlRequest:URLRequest = new URLRequest(url);
urlLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, onXMLDataLoaded);
urlLoader.load(urlRequest);
trace("loadSettings");
}
private function onXMLDataLoaded(event:Event):void {
data = XML(urlLoader.data);
dispatchEvent(new Event(Settings.INIT, true, true));
dispatchEvent(new Event(Settings.FILE,true,true));
}
那么它执行的顺序就应该是先执行loadSettings("customAs/xml/file.xml"),进入loadSettings([url=String):void]url:String):void[/url] 函数,当执行到
urlLoader.addEventListener(Event.COMPLETE, onXMLDataLoaded)的时候,程序只是将urlLoader对象添加到侦听队列中,并没跳转去执行
onXMLDataLoaded(event:Event):void ,所以这个时候dispatchEvent(new Event(Settings.INIT, true, true))该条语句并未执行,也就是说Settings事件源并未派发事件。
执行完loadSettings([url=String):void]url:String):void[/url] 函数后,再执行
Settings.getInstance().addEventListener(Settings.INIT, onSettingsInit)语句,将Settings.getInstance()添加到Settings事件源的队列上,当customAs/xml/file.xm加载完后,Event事件源通知urlLoader对象执行onXMLDataLoaded函数,这之后才会派发 Settings.INIT事件,之后执行onSettingsInit函数
========================================================================
10-18
收藏 | 分类: | 查看: 178 | 评论(0)
public static const dispatcher…”,就是声明一个公有的静态对象,这样才使的可以在任意地方访问到并且对他进行抛出和侦听事件。
自定义CustomEvent类,继承Event,并且给他增加一个dispatcher:EventDispatcher属性。
使用这个类,就可以抛出事件并附带数据。
因为使用了 static 设置为静态属性,所以其他任意地方只要注册有这个事件侦听,就能捕获到。
CustomEvent:
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class CustomEvent extends Event
{
public static const EVENT_NAME:String=”event_name”;
public static const dispatcher:EventDispatcher=new EventDispatcher();
public var data:Object;
public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, data:Object=null)
{
super(type, bubbles, cancelable);
this.data=data;
}
override public function clone():Event{
return new CustomEvent(type, bubbles, cancelable, data);
}
}
}
抛出事件时:
var custom:CustomEvent=new CustomEvent(CustomEvent.CLICK);
//custom.data is Object;//发送事件同时,可以传值(可传可不传)
CustomEvent.dispatcher.dispatchEvent(custom);
侦听事件时:
CustomEvent.dispatcher.addEventListener(CustomEvent.CLICK,clickHandler);