在 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
组件。根据我的经验,它们确实具有更多功能。
- 考虑为文字创建常量。
希望这对您有所帮助。干杯。
在 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
组件。根据我的经验,它们确实具有更多功能。 - 考虑为文字创建常量。
希望这对您有所帮助。干杯。