2010-09-13 33 views
1

我需要能夠從位於Flex 4主應用程序下的組件調用方法。請問如何在不使用FlexGlobals的情況下執行此操作?Flex 4:從組件中訪問主應用程序中的公共方法

附上示例代碼。提前致謝。

// TestApp.mxml (application) 
<?xml version="1.0" encoding="utf-8"?> 
<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" 
         creationComplete="initApp()"> 
    <fx:Script> 
     <![CDATA[ 
      import com.TestComp; 

      import mx.managers.PopUpManager; 

      public function myMethod():void 
      { 
       // do something 
      } 

      protected function initApp():void 
      { 
       var popUp:TestComp = new TestComp(); 

       PopUpManager.addPopUp(popUp, this, true); 
      } 
     ]]> 
    </fx:Script> 
</s:WindowedApplication> 

// TestComp.mxml (component) 
<?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/mx" 
     width="400" height="300"> 
    <fx:Script> 
     <![CDATA[ 
      private function doSomething(event:MouseEvent):void 
      { 
       // call to myMethod() in TestApp.mxml 
      } 
     ]]> 
    </fx:Script> 
    <s:Button click="doSomething(event)" label="Click Me"/> 
</s:Group> 
+0

我不明白...爲什麼你有一個問題,呼籲FlexGlobals .topLevelApplication.doSomething(); ? ? ? ? – 2010-09-13 15:19:10

+0

我被告知這是不好的做法。 – Reado 2010-09-13 16:36:47

+0

如果你開發一個組件,這是一個不好的做法。然後,如果您將其加載到另一個Flex應用程序中,則topLevelApplication會將其他人加載。只要你正在創建一個應用程序,它是足夠安全的!當你已經有權訪問所有你需要的東西時,你應該派遣/監聽事件並不是一個好理由。 – 2010-09-14 06:32:51

回答

2

這是糟糕的設計。你應該提供一個回調函數或一個事件監聽器。

// TestComp.mxml 

<mx:Metadata> 
    [Event(name="doSomethingEvent", type="flash.events.Event")] 
</mx:Metadata> 

<mx:Script><![CDATA[ 

    private function doSomething(event:MouseEvent):void 
    { 
    this.dispatchEvent(new Event("doSomethingEvent")); 
    } 

]]></mx:Script> 

// TestApp.mxml 
protected function initApp():void 
{ 
    var popUp:TestComp = new TestComp(); 
    popUp.addEventListener("doSomethingEvent", myMethod); 
    PopUpManager.addPopUp(popUp, this, true); 
} 

private function myMethod(event: Event): void 
{ 
    // do something 
} 

這是一個回調例子:

// TestComp.mxml 

public var doSomethingCallback: Function; 

private function doSomething(event:MouseEvent):void 
{ 
    doSomethingCallback.call(); 
} 

// TestApp.mxml 
protected function initApp():void 
{ 
    var popUp:TestComp = new TestComp(); 
    popUp.doSomethingCallback = myMethod; 
    PopUpManager.addPopUp(popUp, this, true); 
} 

private function myMethod(): void 
{ 
    // do something 
} 
0

我不同意飛濺,它是不好的設計,但下面應該工作

 
//in TestApp 
protected function initApp():void 
{ 
    var popUp:TestComp = new TestComp(this); 
    PopUpManager.addPopUp(popUp, this, true); 
} 

//in TestComp 
private var app:TestApp; 

public function TestComp(app:TestApp) 
{ 
    this.app = app; 
} 

private function doSomething(event:MouseEvent):void 
{ 
    // call to myMethod() in TestApp.mxml 
    app.myMethod(); 
} 

,或者你可以這樣來做

 
//in TestApp 
protected function initApp():void 
{ 
    var popUp:TestComp = new TestComp(this); 
    popUp.addEventListener('test' , eventListener); 
    PopUpManager.addPopUp(popUp, this, true); 
} 
private function eventListener(event:Event):void 
{ 
    //in which case myMethod doesn't need to be public 
    myMethod(); 
} 

//in TestComp 
private function doSomething(event:MouseEvent):void 
{ 
    dispatchEvent(new Event('test')); 
} 
1

最簡單的操作重刑?

從TestComp中的按鈕中取出單擊處理程序。

在您的主應用程序中,爲MouseEvent.CLICK添加偵聽器到TestComp(如果它是主應用程序的直接子元素)或本身(如果TestComp更靠近顯示列表)。在處理程序中,如果您有直接引用,則通過==來測試事件的目標是否爲TestComp,如果沒有,則通過「is」來測試。

這與你有什麼剛纔的精力最少,仍然依賴於(冒泡)事件,更「正確」

相關問題