Flex - 如何在一个组件中定义另一个组件的功能?

Posted

技术标签:

【中文标题】Flex - 如何在一个组件中定义另一个组件的功能?【英文标题】:Flex - How can I define a function in one component from another? 【发布时间】:2011-01-11 19:59:37 【问题描述】:

我是一个完整的 Flex/Flash 菜鸟,正在运行 Adob​​e 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 - 如何在一个组件中定义另一个组件的功能?的主要内容,如果未能解决你的问题,请参考以下文章

Flex 应用程序到组件?

通过从 flex 中的另一个 mxml 文件访问组件来使组件不可见

flex 覆盖公共函数集数据

具有更多内部功能的 Flex 自定义组件

如何在 Flex 中获取自定义组件的句柄?

如何在flex中访问内联组件的元素?