【问题标题】:How to dispatch an event with dynamic content in Flex?如何在 Flex 中调度具有动态内容的事件?
【发布时间】:2015-06-03 22:50:56
【问题描述】:

我经常需要发送带有 soem 自定义 String 文本的 flash.events.Event,例如:

protected function mouseClicked(event:Event) {
     //here I'd want to notify anyone interested in the button click,
     //and also transfer the name of the button (or whatever) that was clicked - assume some dynamic value
     dispatchEvent(new Event("myMouseEvent"), button.name));
}

当然上述事件是无效的。但是是否有任何事件可以用于该类型的事件?也许是TextEvent,但我不知道我是否会在这里误用它。

【问题讨论】:

标签: actionscript-3 apache-flex


【解决方案1】:

要在您的事件中包含其他数据,请通过扩展Event(或Event 的任何子类)并添加您自己的属性来创建自定义事件类。例如:

class NameEvent extends Event {
    public static const NAME_CLICK:String = "nameClick";
    public var name:String;
    public function NameEvent(type:String, name:String) {
        this.name = name;
        super(type);
    }
}

dispatchEvent(new NameEvent(NameEvent.NAME_CLICK, button.name));

请注意,您的事件类型字符串(本例中为“nameClick”)应该是全局唯一的,否则侦听器可能会将它们与其他事件类型混淆。例如,“click”已经预期为MouseEvent。我经常为我的自定义事件类型添加前缀,例如“NameEvent::click”。


另一个不需要创建自定义事件的选项是依靠预期的目标来获取额外的数据。例如:

// dispatch a custom event from a Button
dispatchEvent(new Event("myClick"));

// handler for "myClick" events on the button
function myClicked(e:Event):void {
    var button:Button = e.target as Button;
    trace(button.name);
}

这不如使用自定义事件类灵活且脆弱,但有时是一种快速简单的解决方案。

【讨论】:

  • 对于 DisplayObject,您需要重写 clone() 方法。
  • @BotMaster 不,你不需要,你只需要覆盖 clone() 如果事件将被重新调度(以便它作为自定义事件重新调度)。这是一个很好的做法,但通常不是必需的。
  • 来自文档:“创建您自己的自定义 Event 类时,您必须重写继承的 Event.clone() 方法,以便它复制您的自定义类的属性。如果您不设置在事件子类中添加的所有属性,当侦听器处理重新调度的事件时,这些属性将不具有正确的值。”这就是为什么 DisplayObject 在自定义事件遍历它时需要在多层显示列表中使用它的原因。你说的对非 DisplayObject 是正确的。
  • 不,它与显示对象无关。正如文档所说,它与重新调度事件有关。冒泡不算作重新调度。在已经调度的事件上使用 dispatchEvent() 是调用 clone() 的地方。
  • @Aaron 你没有,但建议重写 clone() 方法。
猜你喜欢
  • 2016-04-30
  • 2021-09-16
  • 2021-08-26
  • 2013-01-05
  • 2012-06-14
  • 2012-12-28
  • 2021-06-09
  • 2011-10-08
  • 1970-01-01
相关资源
最近更新 更多