【问题标题】:In flex 4.5 parentDocument did not working as in flex 4.0. How to call parentDocument in flex 4.5?在 flex 4.5 中,parentDocument 不像在 flex 4.0 中那样工作。如何在 flex 4.5 中调用 parentDocument?
【发布时间】:2017-04-13 08:52:50
【问题描述】:

在 flex 4.0 中,此代码有效:

<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx" width="500" height="600">
<fx:Script>
    <![CDATA[
        import componentCanvas;

        import mx.containers.TitleWindow;
        import mx.controls.Alert;

        public function createChild():void{
            var c:componentCanvas = new componentCanvas;
            c.x = 20;
            c.y=20;
            toInclude.addChild(c);
        }
    ]]> 
</fx:Script>
<mx:Button click="createChild()"/>
<mx:Canvas id="toInclude"/>

--componentCanvas --

<mx:Canvas xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
<fx:Script>
    <![CDATA[
        import componentCanvas;
        import mx.containers.TitleWindow;
        import mx.controls.Alert;
        import mx.managers.PopUpManager;
        import popAll;

        public function oh():void{
            Alert.show("From titleWindow");
        }

        public function open():void{
            var pop:popAll = popAll(PopUpManager.createPopUp(this, popAll, true));

        }
    ]]>
</fx:Script>
<mx:Label text="Canvas" x="100" y="100"/>
<mx:Button click="open()"/>

-- 全部弹出--

<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300" x="40" y="40" close="closePopUp()">
<fx:Script>
    <![CDATA[
        import mx.managers.PopUpManager;
        public function closePopUp():void{
            super.parentDocument.oh();
            PopUpManager.removePopUp(this);
        }
    ]]>
</fx:Script>
<mx:Button click="closePopUp()"/>

当我在 flex 4 的 titleWindow 中调用 parentDocument 时,一切都很好。 4.5 中的相同代码不起作用。

有没有办法在 Flex 4.5 中做到这一点?

【问题讨论】:

    标签: actionscript-3 apache-flex adobe flex4 flex4.5


    【解决方案1】:

    在所有文件中调用parentDocument 并使用public 函数绝对不是最佳做法!相反,您应该真正研究一下 Flex 中的 Event Life Cycle 以及如何使用它。在我看来,当您想向其用户公开组件的特定功能时,确实应该创建公共方法。

    基本上,您应该从popAll 类中分派一个事件,并在componentCanvas 中创建的实例中监听它。所以,要解决这个问题,你的代码应该是:

    全部弹出:

    <s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s="library://ns.adobe.com/flex/spark" 
                   xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300" x="40" y="40" close="closePopUp()">
        <fx:Script>
            <![CDATA[
                import mx.managers.PopUpManager;
    
                public function closePopUp():void{
                    this.dispatchEvent(new Event("closePopup"));
                    PopUpManager.removePopUp(this);
                }
            ]]>
        </fx:Script>
        <mx:Button click="closePopUp()"/>
    </s:TitleWindow>
    

    和组件画布:

    <mx:Canvas xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
        <fx:Script>
            <![CDATA[
                import mx.controls.Alert;
                import mx.managers.PopUpManager;
    
                private var pop:popAll;
    
                public function oh():void{
                    Alert.show("From titleWindow");
                }
    
                public function open():void{
                    pop = popAll(PopUpManager.createPopUp(this, popAll, true));
                    pop.addEventListener("closePopup", onClosePopupRequested);
    
                }
    
                protected function onClosePopupRequested(event:Event):void
                {
                    pop.removeEventListener("closePopup", onClosePopupRequested); 
                    oh();
                }
    
            ]]>
        </fx:Script>
        <mx:Label text="Canvas" x="100" y="100"/>
        <mx:Button click="open()"/>
    </mx:Canvas>
    

    根据上面的代码,我正在从 popAll 类中分派一个名为 closePopup 的新事件,并在我创建它的实例的位置监听它。然后,一旦事件被捕获,我将删除事件处理程序,然后从事件处理程序中调用您的 oh() 方法。

    我会对您的代码提出更多建议:

    • 重新考虑类和方法的命名约定,并查看骆驼命名约定
    • 避免使用过多的公共方法,而是使用事件在文件/组件之间进行通信。这将使您能够创建松散耦合的组件。
    • 如果您要迁移到 Flex 4.5,我建议您使用 spark 组件而不是 mx 组件。根据我的经验,它们确实具有更多功能。
    • 研究为文字创建常量。

    希望这会有所帮助。干杯。

    【讨论】:

    • 没错!活动就是答案!层次结构不合适。谢谢!
    • @VGG 请标记为已选答案,以便对其他用户有所帮助。乐意效劳。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多