在 flex 4.5 中,parentDocument 不像在 flex 4.0 中那样工作。如何在 flex 4.5 中调用 parentDocument?

In flex 4.5 parentDocument did not working as in flex 4.0. How to call parentDocument in flex 4.5?

在 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"/>

--组件画布--

<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()"/>

-- popAll--

<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 中执行此操作?

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

基本上,您应该从 popAll class 调度一个事件并在 componentCanvas 中创建的实例中收听它。因此,要解决此问题,您的代码应为:

popAll:

<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 class 调度一个名为 closePopup 的新事件,并在我创建它的实例的地方收听它。然后,一旦事件被捕获,我将删除事件处理程序,然后从事件处理程序中调用您的 oh() 方法。

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

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

希望这对您有所帮助。干杯。