【问题标题】:Multiple dispatchHandler Actionscript 3多个 dispatchHandler Actionscript 3
【发布时间】:2012-05-17 09:56:50
【问题描述】:

我想分派一个事件 2 次:

我有一个 MainClass、一个 SecondClass 和一个 ThirdClass。

在 ThirdClass 中,有一个 clickEvent。我将它发送到 SecondClass:

    this.addEventListener(MouseEvent.CLICK, clickHandler);


    public static const CLICKED_HANDLER:String = "clickedHandler";

    public function clickHandler(e:MouseEvent):void {
        dispatchEvent(new Event(CLICKED_HANDLER));
    }

我在SecondClass中抓住并扔掉它:

    object.addEventListener(ThirdClass.CLICKED_Handler, clickedEventListener);


    public static const CLICKED_HANDLER:String = "clickedHandler";

    public function clickedEventListener(e:Event):void {
        dispatchEvent(new Event(CLICKED_HANDLER));
    }

这是我在 MainClass 中发现的:

    object.addEventListener(SecondClass.CLICKED_HANDLER, clickedEventListener);

    public function clickedEventListener(e:Event):void {
        trace("click");
    }

但它不起作用......我做错了什么? 以及如何获取有关单击的 ThirdClass 对象的信息? (通常有 1 个 dispatchEvent,它是:

    var thirdClassObject:ThirdClass = e.currentTarget as ThirdClass;

在clickHandler方法中,但是如何用2个dispatchEvents做到这一点?)

所以:我想知道在我的 MainClass 中单击了哪个 ThirdClass 对象。

非常感谢!

【问题讨论】:

    标签: actionscript-3 events dispatchevent


    【解决方案1】:

    当您调度事件时,target 属性引用调度程序。
    您显然需要的是传递对第三类的引用以及要在主类的事件处理程序中使用的事件。

    您有多种选择来实现这一目标。

    1. 如果调度程序实例在显示列表中,请使用event bubbling 处理父显示对象中的事件。参考Event构造函数和Event.bubbles属性的second argument。这样,您可以订阅父对象中子对象的任何事件,并在事件处理程序中检查 Event.target 属性。大多数鼠标事件,如MouseEvent.CLICK,默认情况下都是冒泡的。所以你可以只听他们在主课上检查目标。

      // inside MainClass
      // notice: we are subscribing to MainClass instance
      this.addEventListener(MouseEvent.CLICK, clickedEventListener);
      public function clickedEventListener(e:MouseEvent):void { trace(e.target); // the target is what was actually clicked // you may also notice the difference between e.target and e.currentTarget }
      如果你还想使用CLICKED_HANDLER事件,你可以这样做:
      // inside ThirdClass
      dispatchEvent(new Event(CLICKED_HANDLER, true));
      // ---------------------------------------^
      请记住:这仅适用于显示列表成员。
      请参阅Event flow article on adobe.com
    2. 创建一个custom event class 并将引用放在那里。 (您还可以将事件冒泡与自定义事件类一起使用。)这样您就可以将事件调度为

      // inside SecondClass
      public function clickedEventListener(e:Event):void {
          var customEvent:CustomEventClass = new CustomEventClass(CLICKED_HANDLER);
          customEvent.customTarget = e.target;
          dispatchEvent(customEvent);
      }
      // inside MainClass public function clickedEventListener(e:CustomEventClass):void { trace(e.customTarget ); }

    【讨论】:

      【解决方案2】:

      首先,定义“它不起作用......”是什么意思?

      SecondClass 是否收到事件?如果是这样,你可以试试这个:

      //SecondClass
      public function clickedEventListener(e:Event):void {
          dispatchEvent(e);
      }
      
      //MainClass
      object.addEventListener(ThirdClass.CLICKED_HANDLER, clickedEventListener);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-08
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 2017-11-03
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多