如何判断控件何时首次可见?

时间:2011-06-07 13:31:27

标签: flex actionscript viewstack tabnavigator

我有一个包含TabNavigator控件的弹出窗口。弹出窗口加载时,选项卡会动态添加到TabNavigator。是否有一种很好的方法可以从标签本身中确定何时加载其中一个标签?

我有一个需要进行服务调用的标签,我不希望进行服务调用,除非用户实际去过并单击标签进行查看。当TabNavigator索引发生变化时,我可以从弹出控件本身通知选项卡,但这似乎不是一个好方法。我想知道是否有一个事件或我能挂钩的东西会让我知道第一次需要渲染的选项卡(从选项卡控件本身)。提前谢谢!

3 个答案:

答案 0 :(得分:2)

我想我不太明白这个问题,所以我再试一次。我认为这段代码可以解决您的问题。

技巧是将组件的创建策略设置为“none”。 Flex将创建选项卡,但不会创建组件本身。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="onCreationComplete()" layout="vertical" minWidth="955" minHeight="600">
<mx:TextArea id="log" width="100%" height="500"/>

<mx:Script>
    <![CDATA[
        import mx.containers.Canvas;
        import mx.events.FlexEvent;
        private function onCreationComplete():void{
            var canv:Canvas = new Canvas();
            canv.label = "One";
            canv.addEventListener(FlexEvent.CREATION_COMPLETE,onCreateTab);
            canv.creationPolicy="none";
            tn.addChild(canv);
            canv = new Canvas();
            canv.label = "Two";
            canv.addEventListener(FlexEvent.CREATION_COMPLETE,onCreateTab);
            canv.creationPolicy="none";
            tn.addChild(canv);
            canv = new Canvas();
            canv.label = "Three";
            canv.addEventListener(FlexEvent.CREATION_COMPLETE,onCreateTab);
            canv.creationPolicy="none";
            tn.addChild(canv);
        }

        private function onCreateTab(event:Event):void{
            log.text+=event.currentTarget.label+ " created for the very first time\n";
        }
    ]]>
</mx:Script>    
<mx:TabNavigator id="tn" width="500"/>
</mx:Application>

答案 1 :(得分:1)

有一个名为“FlexEvent.SHOW”的事件应该对你有用。请参阅:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/events/FlexEvent.html#SHOW

你可以把它放在TabNavigator上。即。

<mx:TabNavigator>
   <comp:SomeComp show="doSomething()" label="My Tab"/>
</mx:TabNavigator>

或者您可以将其放入组件中。即。

<mx:Canvas show="doSomething">
<!-- My Component-->
</mx:Canvas>

如果您设置了创建策略,您也可以在creationComplete上执行此操作,但只会在创建选项卡的第一时间进行。

运行示例:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" minWidth="955" minHeight="600">
    <mx:TextArea id="log" width="100%" height="500">

    </mx:TextArea>
    <mx:TabNavigator width="500">
        <mx:Canvas label="One" show="{log.text+='One Clicked\n';}"/>
        <mx:Canvas label="Two" show="{log.text+='Two Clicked\n';}"/>
        <mx:Canvas label="Three" show="{log.text+='Three Clicked\n';}"/>
        <mx:Canvas label="Four" show="{log.text+='Four Clicked\n';}"/>
    </mx:TabNavigator>
</mx:Application>

使用动态标签。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="cc()" layout="vertical" minWidth="955" minHeight="600">
<mx:TextArea id="log" width="100%" height="500">

</mx:TextArea>

<mx:Script>
    <![CDATA[
        import mx.containers.Canvas;
        import mx.events.FlexEvent;
        private function cc():void{
            var canv:Canvas = new Canvas();
            canv.label = "One";
            canv.addEventListener(FlexEvent.SHOW,onShow);
            tn.addChild(canv);
            canv = new Canvas();
            canv.label = "Two";
            canv.addEventListener(FlexEvent.SHOW,onShow);
            tn.addChild(canv);
        }

        private function onShow(event:Event):void{
            log.text+=event.currentTarget.label+ " clicked\n";
        }
    ]]>
</mx:Script>

<mx:TabNavigator id="tn" width="500">
</mx:TabNavigator>
</mx:Application>

答案 2 :(得分:0)

阅读Flex Component LifeCycle。根据您的描述,我可能会在选项卡的内容上监听creationComplete事件。