[flex] 关于Flex为事件定义元数据、使事件成为组件的一个特殊属性的问题
dunhuacc12
2010-03-04
使用Metadata 标签给组件添加元数据:使事件成为组件的一个特殊属性。
<mx:Metadata> <!-- 为事件定义元数据 --> [Event(name="clickImage", type="events.ImageEvent")] </mx:Metadata> 这样在使用组件的标签,就会出现 clickImage 属性,自动完成addEventListener 的工作。 那我在主程序里面就不用给事件写addEventListener方法了么? <ns1:EventCanvas id="myCanvas" clickImage="...方法"/> “...方法”就能被调用了么? 如果是的话,为什么我的就是不好使呢? 各位大侠能给个相关的例子么? 万分感激~ |
|
dunhuacc12
2010-03-04
谢谢各位了, 这个问题让我困扰了一下午, 美好的光阴啊~!
|
|
cuixuxucui
2010-03-05
你在哪里调用的dispathEvent?如果是在EventCanvas中,那这个例子应该能响应啊。。。
如果是在别的地方抛的,你就要考虑冒泡,看看事件能不能走到你的EventCanvas侦听 |
|
dunhuacc12
2010-03-05
是在EventCanvas中派发的,就是不好使~
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <![CDATA[ import cliEvent.ClickImage; internal function giveTime():void{ var currentTime:String; var date:Date = new Date(); currentTime = date.getHours() + ":" +date.getMinutes(); var cliImage:ClickImage = new ClickImage(currentTime); this.dispatchEvent(cliImage); } ]]> </mx:Script> <mx:Metadata> <!-- 为事件定义元数据 --> [Event(name="clickI", type="cliEvent.ClickImage")] </mx:Metadata> <mx:Button id="btn" x="327" y="54" click="giveTime()"/> </mx:Canvas> |
|
cuixuxucui
2010-03-05
你侦听的事件类型是clickI,抛的却是currentTime类型,当然不行。必须抛的也是clickI,你可以把这个字符串存到ClickImage事件(PS:这个事件名称不规范吧,事件最好是**Event来命名)的一个静态常量里。
如果你想让自定义的事件携带数据,比如你想携带currentTime这个字符串,你需要在自定义事件时,额外增加一个属性,可以用public,也可以private加getter,setter。然后在侦听函数里访问这个属性就OK了。 |
|
cuixuxucui
2010-03-05
表达的不是很清楚,粘个代码吧:
package components { import mx.events.FlexEvent; public class MyEventTest extends FlexEvent { public static const ONCHANGE:String = "onChange"; public var eventInfo:String; //自定义的事件信息 public function MyEventTest(s:String){ super(s); eventInfo="这个事件是:"+s; } } } package components { import mx.core.UIComponent; [Event(name="onChange", type="components.MyEventTest")] public class ComponentForEvent extends UIComponent { //private var name:String; public function changeName(newName:String):void { this.name=newName; dispatchEvent(new MyEventTest(MyEventTest.ONCHANGE) ); } } } <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:components="components.*" layout="absolute"> <mx:Script> <![CDATA[ import mx.controls.Alert; import components.MyEventTest; private function changeName():void { cfe.changeName("新名称"); } private function onChangeHandler(event:MyEventTest):void { Alert.show(event.eventInfo+"target:"+event.target+"curTarget:"+event.currentTarget+"phase:"+event.eventPhase); } ]]> </mx:Script> <mx:Button id="testBtn" click="changeName()" label="测试事件组件"/> <components:ComponentForEvent id="cfe" onChange="onChangeHandler(event)"/> </mx:Application> |
|
dunhuacc12
2010-03-05
问题解决了~
<mx:Metadata> <!-- 为事件定义元数据 --> [Event(name="clickImage", type="events.ImageEvent")] </mx:Metadata> 此处的name属性必须是events.ImageEvent事件的名字, 就是在events.ImageEvent类的构造函数内部调用父类的构造函数时传递的字符串, super("clickimage",false,false); 谢谢楼上的提醒,让这个困扰我很久的问题解决了,真是万分感谢~ |
|
dunhuacc12
2010-03-05
补充一下我的错误:
我在事件类内部的构造方法里给super()方法传递的参数是"clickImage", 而在自定义控件里给添加属性起的名字是"clickI" <mx:Metadata> <!-- 为事件定义元数据 --> [Event(name="clickI", type="cliEvent.ClickImage")] </mx:Metadata> 所以程序一直跑不起来, 再次谢谢楼上的大侠~ |
|
wolfman.hu
2010-03-05
去投票吧,可以向总理提问,关系我们网站现存问题的--备案, http://act3.news.qq.com/news/749/show.php?id=207737
|
|
dunhuacc12
2010-03-05
万恶的公司防火墙
|