【问题标题】:AS3 - Dispatch an Event DOWN the display list (instead of up)AS3 - 在显示列表中向下调度事件(而不是向上)
【发布时间】:2009-12-15 05:55:29
【问题描述】:

考虑一下(伪代码):

var country = new Country();
addChild(country);

var state = new State();
country.addChild(state);

var city = new City();
state.addChild(city);

我可以像这样(在 City 类中)将事件从城市发送到国家:

dispatchEvent(new CustomEvent(CustomEvent.WHATEVER));

因为事件会在显示列表中冒泡。但是我怎样才能从 COUNTRY 类中发送一个事件,以便 City 能够听到呢?当我向城市添加事件侦听器时,从国家/地区发送的事件不会注册。

【问题讨论】:

    标签: flash actionscript-3 events event-handling


    【解决方案1】:

    可能不太理想,但我只是从子对象中将侦听器添加到舞台,因此当事件冒泡到舞台时它会捕获事件。

    【讨论】:

      【解决方案2】:

      您可以通过引用其父级的父级将一个城市设置为侦听器。

      class City extends Sprite
      {
          public function City()
          {
              this.addEventListener(Events.ADDED_TO_STAGE, this.foo()); // P.S. Verify event type. This is over the top of my head.
          }
      
          private function addedToStage(e:Event):void
          {
              this.parent.parent.addEventListener(Country.EVENT_TYPE, this.foo());
          }
      
          private function foo(e:Event):void
          {
              // Handle event
          }
      }
      

      现在这一切都很花哨,但可能有更好的方法来构建您的代码。现在,你有一个循环依赖,如果没有正确清理可能会导致内存泄漏。如果您可以详细说明您的要求,那么有人可能会建议另一种方法。

      【讨论】:

      • 嗯,它可能超过 2 层深,所以我不想走 parent.parent 这条路。一定有更好的方法让对象“向下”显示列表来监听事件?
      • 您似乎在这里建立了某种层次结构。在这种情况下,您应该有一个常规的消息传递模式,而不是让任意节点为其父节点设置侦听器。查找树视图的实现以理解我的意思。如果您确实走这条路,那么您应该让 Country 节点将对其子节点的引用存储在列表中,然后在必须触发事件时遍历该列表。子节点将类似地具有其自己的子节点的列表并将消息传递给每个子节点。这种方法消除了循环依赖,更容易维护。
      【解决方案3】:

      您可以使用单例事件调度程序类,在这种情况下可能会派上用场。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-24
        • 1970-01-01
        • 2013-06-20
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多