Flex - Как я могу определить функцию в одном компоненте из другого? - PullRequest
1 голос
/ 01 февраля 2010

Я полный новичок 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" width="400" height="300" 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" width="380" height="280" title="Test" id="pnlTest">
                <s:Button x="131" y="104" label="OLD" id="btnTest" click="test()"/>
        </s:Panel>
    </s:Group>

Теперь скажите, что я хочу изменить test() в popup.mxml при вызове его в main.mxml ... как мне это сделать? Пожалуйста, включите детали ... помните, что я нуб: -)

Ответы [ 2 ]

1 голос
/ 01 февраля 2010

Конечно, сразу после публикации вопроса идея приходит мне в голову. Я решил опубликовать решение здесь вместо того, чтобы просто удалить вопрос, если оно кому-нибудь еще поможет.

Я просто полностью извлек test() из popup.mxml и изменил init() в main.mxml, чтобы он выглядел так:

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";
    <b>popInstance.btnTest.addEventListener("click", function():void { Alert.show("REDEFINED"); });</b>
}
0 голосов
/ 01 февраля 2010

Если я получу то, что вы просите, вы можете сделать 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.
...