2017-04-13 69 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请标记为选定的答案,以便对其他用户有所帮助。乐意效劳。谢谢。 –