Flex - 如何在一个组件中定义另一个组件的功能?
Posted
技术标签:
【中文标题】Flex - 如何在一个组件中定义另一个组件的功能?【英文标题】:Flex - How can I define a function in one component from another? 【发布时间】:2011-01-11 19:59:37 【问题描述】:我是一个完整的 Flex/Flash 菜鸟,正在运行 Adobe Flash Builder 4 Beta 2。我有一个主要组件需要能够调用多个弹出窗口,每个弹出窗口除了一个功能和几个标签外几乎相同。显然,我更希望能够在调用弹出窗口时定义此函数并更改这些标签,而不是拥有大量具有几乎相同代码的 .mxml 文件,我只是不知道该怎么做。我想出了如何更改标签,但不确定如何重新定义功能。
为简单起见,假设我的代码如下所示:
main.mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009" :s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.managers.PopUpManager;
protected function init():void
var alertWindow:IFlexDisplayObject = PopUpManager.createPopUp(FlexGlobals.topLevelApplication as DisplayObject, popup, true);
PopUpManager.centerPopUp(alertWindow);
var popInstance:transmitRoundPop = alertWindow as transmitRoundPop;
popInstance.btnTest.label = "NEW";
]]>
</fx:Script>
</mx:Module>
popup.mxml:
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" xmlns:flash="services.flash.*">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.managers.PopUpManager;
public function test():void
Alert.show("ORIGINAL");
PopUpManager.removePopUp(this);
]]>
</fx:Script>
<s:Panel x="10" y="10" title="Test" id="pnlTest">
<s:Button x="131" y="104" label="OLD" id="btnTest" click="test()"/>
</s:Panel>
</s:Group>
现在说我想在 main.mxml 中调用它时更改 popup.mxml 中的test()
...我该怎么做?请提供详细信息...记住我是菜鸟:-)
【问题讨论】:
更改 test() 是什么意思?改一下里面的代码?参数? 抱歉,我的想法不对。我想更改其中的代码,或者更准确地覆盖/覆盖/重新定义函数,但我想我现在找到了正确的方法。 【参考方案1】:当然,在发布问题后,我的脑海中立刻浮现出这个想法。我想我会在这里发布解决方案,而不是仅仅删除问题以防它对其他人有所帮助。
我刚刚从 popup.mxml 中完全取出 test()
并修改 main.mxml 中的 init()
看起来像这样:
protected function init():void
var alertWindow:IFlexDisplayObject = PopUpManager.createPopUp(FlexGlobals.topLevelApplication as DisplayObject, popup, true);
PopUpManager.centerPopUp(alertWindow);
var popInstance:transmitRoundPop = alertWindow as transmitRoundPop;
popInstance.btnTest.label = "NEW";
popInstance.btnTest.addEventListener("click", function():void Alert.show("REDEFINED"); );
【讨论】:
【参考方案2】:如果我明白了您的要求,您可以将 test() 设为函数变量并为其提供公共访问权限,以便其他组件可以更改它。
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.managers.PopUpManager;
// "test" is now a function variable,
// you change it just like any other variable,
// but you can call it as well, just like before.
public var test:Function;
public function defaultTest():void
Alert.show("ORIGINAL");
PopUpManager.removePopUp(this);
protected function init():void
// Setting a default value for test
// otherwise it would give you an error when calling
// an unassigned function variable.
this.test = defaultTest;
...
]]>
</fx:Script>
现在在另一个组件中:
public function mainTest():void
...
...
myPopup.test = mainTest; // setting the variable, note that there are no parentheses.
myPopup.test(); // running the function, note that there are now parentheses.
【讨论】:
我也试过了,但它并不完全适合我。该函数在用户点击弹出窗口中的按钮时调用,因此该函数需要从popup.mxml调用,而不是main.mxml。即使在执行 myPopup.test = mainTest 之后,它仍在调用 defaultTest()。我怀疑(可能是错误的)这是因为那时已经创建了弹出窗口。在创建弹出窗口之前我无法更改该功能,因为我需要弹出窗口来执行此操作。再说一次,我也有可能做得不对……你的方式对我来说也很有意义。 是的,我相信 PopupManager 会创建自己的弹出窗口。我相信您上面的代码是 alertWindow 的一部分。以上是关于Flex - 如何在一个组件中定义另一个组件的功能?的主要内容,如果未能解决你的问题,请参考以下文章