【问题标题】:How to tell when control becomes visible for the first time?如何判断控件何时首次可见?
【发布时间】:2011-09-10 02:12:23
【问题描述】:

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

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

【问题讨论】:

    标签: apache-flex actionscript viewstack tabnavigator


    【解决方案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>
    

    【讨论】:

    • 不是每次点击标签时都会触发 show 事件吗?他只想在第一次单击选项卡时运行此代码;不是每次。
    • 实际上,单击选项卡时似乎不会触发此选项。它适用于“可见”属性,该属性不会因为当前未选择选项卡而设置为 false。
    • show 事件在 tabNavigators 上一直对我有效,但对它的子组件无效。我能想到的唯一其他事件可能是焦点事件?
    • 我刚刚用这段代码做了一个测试,代码发布在第一条评论中。工作正常。
    • 我相信您的示例会产生不同的结果,因为您没有动态加载选项卡。
    【解决方案2】:

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

    【讨论】:

    • 不幸的是,creationComplete 在标签添加到导航器时被调用,而不是在它第一次显示在导航器中时。
    • @Ocelot20 我不确定,抱歉。 TabNavigator 使用延迟实例化做了一些奇怪的事情,其中​​将创建“子/标签源”,但不会创建孩子的孩子或类似的东西。我没有使用足够多的组件来拍下这些东西。您可以使用 updateComplete 并使用标志来判断您是否已经拥有数据。除了我打赌 updateComplete 会在 creationComplete 之后立即触发。
    • 你是对的,添加内容时也会调用 updateComplete 。也许这并不容易完成,我应该从外面通知标签。
    【解决方案3】:

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

    诀窍是将组件的创建策略设置为“无”。 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>
    

    【讨论】:

    • 用火花NavigatorContent 控件替换Canvas,由于某种原因这不起作用。绝对让我失望了一会儿。我想我只需要使用Canvas,除非你知道为什么会这样。感谢您的解决方案。
    • 出于某种原因,我认为您仍在使用 Flex 3,我的错。你是 4 还是 4.5?
    • 有趣,在 SkinnableContainer.as (navigatorContent 的父级)中,我发现设置创建策略实际上并没有正确生效......竖起旗帜!然后它通过 setStyle 将实际的创建策略存储在 CSS var 中。这样做是为了避免继承该属性,因为 Spark 和 MX 处理它的方式不同。很遗憾,我没有快速的解决方案。
    • 没问题,您已经对情况有了足够的了解!感谢您进一步研究。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2011-02-16
    • 2014-05-03
    相关资源
    最近更新 更多