在ViewStack的孙子中接收FlexEvent.SHOW事件

时间:2012-02-28 14:29:04

标签: actionscript-3 flex actionscript

ViewStack的直接子项在显示相应的子视图后会收到FlexEvent.SHOW。不幸的是,事件信息在较深的子级别丢失,因此ViewStack的孙子孙女不会收到SHOW事件。

最好采用哪种方法来利用SHOW来自孙子或曾孙子的直接孩子所接收的ViewStack事件?

当然,使用parent.parent.[...].addEventListener(FlexEvent.SHOW, [...])是可能的,但是有点难看,因为一旦两个组件之间的层次结构级别发生变化,它就会中断。

是否有更适合的其他事件?

我的问题的背景是,当我再次看到孙子的内容时,我想重新载入孙子的内容。

2 个答案:

答案 0 :(得分:2)

您可以在孙子视图中侦听ADDED_TO_STAGE事件,并查明您是否属于视图堆栈。如果是,那么只需听取视图堆栈子项的显示/隐藏事件。

... addedToStage="setMeUpForViewStack()" ...

这是:

private var vsView:UIComponent = null;

private function setMeUpForViewStack():void
{
  if (vsView) {
    vsView.removeEventListener("show", vsViewShowHideHandler);
    vsView.removeEventListener("hide", vsViewShowHideHandler);
    vsView = null;
  }

  var obj:DisplayObject = this;
  while (obj.parent != obj) {
    if (obj.parent is ViewStack) {
      vsView = obj;
      break;
    }

    obj = obj.parent;
  }

  if (vsView) {
    vsView.addEventListener("show", vsViewShowHideHandler, false, 0, true);
    vsView.addEventListener("hide", vsViewShowHideHandler, false, 0, true);
  }
}

在您的vsViewShowHideHandler中,您将重新加载内容(如果视图可见)。

基本上,这可以让您免于担心嵌套的程度。但它不适用于多个嵌套视图堆栈。

REMOVED_FROM_STAGE事件处理程序中,您会忘记vsView

答案 1 :(得分:0)

尽管埋在视图堆中会起作用我同意这很难看,并且一旦发生变化就可能导致头痛。

另一种方法可能是实现全局事件调度程序。

通过在类中使用静态事件调度程序,孙子孙可以从应用程序中的某个地方订阅来自静态调度程序的事件。

当父母听到FlexEvent.Show时,处理程序可以使用全局调度程序调度自定义事件吗?