2017-04-13 100 views
0

在柔性4.0此代碼的工作:在flex 4.5中,parentDocument沒有像在flex 4.0中那樣工作。如何在flex 4.5中調用parentDocument?

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

- 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中做到這一點?

回答

1

調用parentDocument和使用public跨所有文件的功能絕對不是最佳實踐!相反,你應該仔細研究Flex中的Event Life Cycle以及如何使用它。在我看來,公共方法應該在你想要向用戶展示組件的特定功能時真正創建。

基本上,你應該從popAll類派出一個事件,並在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> 

和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 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> 

按照上面的代碼,我派遣一個稱爲closePopup新事件從popAll類中,並在創建它的實例的地方聽它。然後,一旦事件被捕獲,我將刪除事件處理程序,然後在事件處理程序中調用您的oh()方法。

我會在你的代碼做一些更多的建議:

  • 重新考慮的類和方法的命名約定,並請看看駱駝情況下,使用過多的公共方法命名約定
  • 避免,而是使用事件在文件/組件之間進行通信。這將使您能夠創建鬆散耦合的組件。
  • 如果您正在轉向Flex 4.5,我會建議您使用spark組件而不是mx組件。根據我的經驗,它們具有更多的多功能性。
  • 研究爲文字創建常量。

希望這會有所幫助。乾杯。

+0

正是!事件就是答案!層次結構不適用。謝謝! – VGG

+0

@VGG請標記爲選定的答案,以便對其他用戶有所幫助。樂意效勞。謝謝。 –