[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
万恶的公司防火墙 
Global site tag (gtag.js) - Google Analytics