关于Flex的事件捕获有关问题,请兄弟们帮小弟我解决,谢过~
关于Flex的事件捕获问题,请兄弟们帮我解决,谢过~~~~
问题是这样的,我自己写了一个model类,它继承自EventDispatcher,然后在主mxml中放置一个button和一个panel,要求点击button后,在button的响应函数中new 出model的对象m,然后用m发送MouseEvent.CLICK消息,panel当然会在整个程序的初始化时添加这个消息的监控器,如果panel接收到这个消息,则提示panel clicked。
但是现在panel不能接收到这个消息,稍微改变程序如下:
1.在m上添加消息监控器,m能接收这个消息;
2.在主mxml中随意放置一个控件,利用它发送消息,panel能接收。
现在我的要求是使用m对象发送消息,然后panel来接收消息。 请各位大大相助!!!!万分感激~~~~
下面是代码:
model.as
test.mxml
------解决方案--------------------
因为m.dispatchEvent(new Event(MouseEvent.CLICK));
m是个局部变量而已,跟Panel 没有什么层次关系,所以m派发的事件panel是监听不到的。
这样改不知道,你可以接受不:
p1.dispatchEvent(new Event(MouseEvent.CLICK));
用panel去派发事件,当然他很容易接受到。
注:如果你还想把model当参数在event里面,建议自定义一个event。把model存放在event里面
这样的好处,model不用再继承EventDispatcher来派发事件,继承上以后可能会更灵活
------解决方案--------------------
感觉LZ化简为烦了,直接p1.dispatchEvent(new Event(MouseEvent.CLICK));
m.dispatchEvent(new Event(MouseEvent.CLICK));该事件的目标M;
在概念上,到事件目标的此往返行程被划分为三个阶段:捕获阶段包括从根到事件目标节点之前的最后一个节点的行程,目标阶段仅包括事件目标节点,冒泡阶段包括回程上遇到的任何后续节点到显示列表的根。
所以按LZ代码来看,从视图根到M再从M到视图的根,唯一可以触发的是视图根节点上的事件吧!!
问题是这样的,我自己写了一个model类,它继承自EventDispatcher,然后在主mxml中放置一个button和一个panel,要求点击button后,在button的响应函数中new 出model的对象m,然后用m发送MouseEvent.CLICK消息,panel当然会在整个程序的初始化时添加这个消息的监控器,如果panel接收到这个消息,则提示panel clicked。
但是现在panel不能接收到这个消息,稍微改变程序如下:
1.在m上添加消息监控器,m能接收这个消息;
2.在主mxml中随意放置一个控件,利用它发送消息,panel能接收。
现在我的要求是使用m对象发送消息,然后panel来接收消息。 请各位大大相助!!!!万分感激~~~~
下面是代码:
model.as
- Java code
package { import flash.events.EventDispatcher; public class model extends EventDispatcher { public function model() { } } }
test.mxml
- XML code
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApp()" xmlns:local="*"> <mx:Script> <![CDATA[ import mx.controls.Alert; import flash.events.Event; internal function initApp():void { p1.addEventListener(MouseEvent.CLICK,pClick,true); } internal function pClick(evn:Event):void { Alert.show("panel clicked","caution"); } internal function click():void { var m:model = new model(); m.dispatchEvent(new Event(MouseEvent.CLICK)); } ]]> </mx:Script> <mx:Panel id="p1" x="320" y="71" width="250" height="200" layout="absolute"> </mx:Panel> <mx:Button id="b1" x="148" y="163" label="Button" click="click()" width="98" height="35"/> </mx:Application>
------解决方案--------------------
因为m.dispatchEvent(new Event(MouseEvent.CLICK));
m是个局部变量而已,跟Panel 没有什么层次关系,所以m派发的事件panel是监听不到的。
这样改不知道,你可以接受不:
p1.dispatchEvent(new Event(MouseEvent.CLICK));
用panel去派发事件,当然他很容易接受到。
注:如果你还想把model当参数在event里面,建议自定义一个event。把model存放在event里面
这样的好处,model不用再继承EventDispatcher来派发事件,继承上以后可能会更灵活
------解决方案--------------------
感觉LZ化简为烦了,直接p1.dispatchEvent(new Event(MouseEvent.CLICK));
m.dispatchEvent(new Event(MouseEvent.CLICK));该事件的目标M;
在概念上,到事件目标的此往返行程被划分为三个阶段:捕获阶段包括从根到事件目标节点之前的最后一个节点的行程,目标阶段仅包括事件目标节点,冒泡阶段包括回程上遇到的任何后续节点到显示列表的根。
所以按LZ代码来看,从视图根到M再从M到视图的根,唯一可以触发的是视图根节点上的事件吧!!