2010-02-01 45 views
1

我是一个完整的Flex/Flash noob,运行Adobe Flash Builder 4 Beta 2.我有一个主要组件,需要能够调用几个弹出窗口,每个弹出窗口大多都相同,除了一个函数和几个标签。显然,我更喜欢能够定义这个函数,并在调用弹出窗口时更改这些标签,而不是使用几乎相同的代码来创建大量的.mxml文件,我只是不知道该怎么做。我想出了如何改变标签,但不知道如何重新定义这个功能。Flex - 如何在另一个组件中定义一个功能?

为简单起见,假设我的代码如下所示:

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()在在main.mxml中调用它时popup.mxml ......我该怎么做?请包括详细信息...请记住我是一个菜鸟:-)

+0

你是什么改变测试意味着()?改变它的代码?参数? – CookieOfFortune 2010-02-01 17:45:30

+0

对不起,没有想好。我想更改其中的代码,或者更准确地覆盖/覆盖/重新定义该函数,但我认为我现在已经找到了正确的方法。 – Travesty3 2010-02-01 17:59:26

回答

1

当然,张贴的想法浮现在我脑海中的问题之后。我想我会在这里发布解决方案,而不是仅仅删除问题,以防其他人帮助。

我只是把test()出完全popup.mxml和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"); }); 
} 
0

如果我得到你问的问题,你可以使测试()一个函数变量,并给它的公共访问,以便其他组件可以改变它。

<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. 
+0

我也试过这个,但它并不适合我。当用户点击弹出窗口中的按钮时会调用该函数,因此该函数需要从popup.mxml中调用,而不是main.mxml。即使在执行myPopup.test = mainTest之后,它仍在调用defaultTest()。我怀疑(可能是错误的),这是因为弹出窗口已经在那个时候创建​​了。在创建弹出窗口之前,我无法更改该功能,因为我需要弹出窗口来执行此操作。然后再次也有可能我只是没有做正确的事情......你的方式对我也很有意义。 – Travesty3 2010-02-01 18:20:36

+0

是的,我相信PopupManager会创建自己的弹出窗口。我相信你上面的代码是alertWindow的一部分。 – CookieOfFortune 2010-02-01 18:29:49

相关问题