ViewStack
的直接子项在显示相应的子视图后会收到FlexEvent.SHOW
。不幸的是,事件信息在较深的子级别丢失,因此ViewStack
的孙子孙女不会收到SHOW
事件。
最好采用哪种方法来利用SHOW
来自孙子或曾孙子的直接孩子所接收的ViewStack
事件?
当然,使用parent.parent.[...].addEventListener(FlexEvent.SHOW, [...])
是可能的,但是有点难看,因为一旦两个组件之间的层次结构级别发生变化,它就会中断。
是否有更适合的其他事件?
我的问题的背景是,当我再次看到孙子的内容时,我想重新载入孙子的内容。
答案 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
时,处理程序可以使用全局调度程序调度自定义事件吗?