在Flex中重新访问页面时未调用initialize()或creationComplete()方法

时间:2010-12-17 19:08:47

标签: flex

在我的flex应用程序中,我使用viewstack.selectedchild()属性来更改视图。

当我通过viewstack.selectedchild()属性重新访问视图时,不会调用initialize方法..

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:2)

该对象已经被创建,因此它不会重新初始化它已经在内存中(这在大多数情况下是一件好事)。你想要监视视图堆栈中所选子项的更改,只需添加一个监听器,而不是每次更改视图时都需要它的逻辑。 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/containers/ViewStack.html?filter_flex=4.1&filter_flashplayer=10.1&filter_air=2#event:change 或者,您可以在视图堆栈中的对象中使用show事件,以便在事件从不可见变为可见时获取事件。

答案 1 :(得分:1)

要回答您的具体问题,默认情况下,每个视图在最初显示时都会被实例化并初始化一次(与创建完成时相同)。之后,在视图之间切换不会导致它们再次初始化。如果要在所选视图更改时执行某种操作,则应将监听器附加到ViewStack以获取mx.events.IndexChangedEvent.CHANGE事件。了解有关Flex组件生命周期(包括初始化)的更多信息也很有帮助。这是我发现有用的图表:http://danorlando.com/?p=122

希望有所帮助。

答案 2 :(得分:1)

我仍然太缺乏完全回答这个问题的信息,最终目标是什么,在舞台上有一个视图堆栈,知道所选索引何时改变,你就这样做:

<mx:ViewStack id="viewstack" width="100%" height="100%" change="changeHandler(event)">
    <s:NavigatorContent id="view1" label="view1">
    <views:view1 />
    </s:NavigatorContent>
<s:NavigatorContent id="view2" label="view2">
    <views:view2 />
</s:NavigatorContent>
</mx:ViewStack>

在changeHandler函数中,您可以使用event.selectedIndex属性来了解哪个项目正在显示...或者您可以查看view1.visible属性。您可以通过执行viewStack.selectedIndex = 0或viewStack.selectedChild = view1以编程方式更改显示的那个。

此外,如果您想从组件内部了解(例如在view1的mxml中),您可以使用show属性,例如:

<views:view2 show="showHandler(event)"/>

答案 3 :(得分:1)

当您从不可见传递到可见时,将调度组件的show()事件, 所以下面的代码不适用于viewstack中包含的组件

<s:NavigatorContent id="view1" label="view1">
 <views:view2 show="showHandler(event)"/>
</s:NavigatorContent>

在viewStack组件中,简单的方法是管理change事件 采取以下MXML

<mx:ViewStack id="viewStack" change="onViewStackChange(event)">
 <s:NavigatorContent id="view1" label="view1_lbl">
  <views:view1 name="v1"/>
 </s:NavigatorContent>
 <s:NavigatorContent id="view2" label="view2_lbl">
  <views:view2 name="v2"/>
 </s:NavigatorContent>
</mx:ViewStack>

使用此ActionScript代码

protected function onViewStackChange(event:IndexChangedEvent):void
{
    // alert label of selected nav content
    Alert.show("View Stack Change, Selected  = " + viewStack.selectedChild.label);

    // get selected nav content then show name of first child
    var navContent: NavigatorContent = (viewStack.selectedChild as NavigatorContent);
    Alert.show( "Change, 1st child is: " + navContent.getChildAt(0).name ); 
}

您可以按标签区分多个组件

干杯

答案 4 :(得分:0)

main.mxml

<mx:ViewStack id="viewstack" width="100%" height="100%">
    <s:NavigatorContent id="view1" label="view1">
    <views:view1 />
    </s:NavigatorContent>
<s:NavigatorContent id="view2" label="view2">
    <views:view2 />
</s:NavigatorContent>