2009-02-04 79 views
4

im正在寫一個actionScript類來處理我的Web服務調用。當我檢索結果時,我想在我的主要mxml應用程序中調用setter方法。我的問題是,我不知道如何訪問我的主要mxml類的actionScript部分中的方法從我的動作類,任何想法?flex 3從actionscript代碼訪問主mxml

回答

7

David是對的 - 雖然您可以從應用程序的任何位置靜態訪問Application.mxml對象的公共成員,但從設計角度來看,這是一個不容否認的問題。爭取物體之間的鬆散耦合效果會更好,Flex成語中的方式通常是擴展EventDispatcher和派發事件。因此,例如,你的WebService的包裝可能是這個樣子:

public class MyWrapperClass extends EventDispatcher 
{ 
    [Event(name="webserviceComplete", type="flash.events.Event")] 

    public function MyWrapperClass(target:IEventDispatcher=null) 
    { 
     super(target); 
    } 

    private function handleWebServiceLoadComplete(event:ResultEvent):void 
    { 
     dispatchEvent(new Event("webserviceComplete")); 
    } 

    public function doWork():void 
    { 
     // Load the service, etc., and ultimately call handleWebServiceLoadComplete()... 
    }  
} 

...和你Main.mxml文件是這樣的:

<mx:Script> 
    <![CDATA[ 

     private function app_creationComplete(event:Event):void 
     { 
      var myWrapper:MyWrapperClass = new MyWrapperClass(); 
      myWrapper.addEventListener("webserviceComplete", mywrapper_webServiceComplete, false, 0, true); 
      myWrapper.doWork(); 
     } 

     private function mywrapper_webServiceComplete(event:Event):void 
     { 
      // Do the work you would've otherwise done in the public method 
     } 

    ]]> 
</mx:Script> 

在這種情況下,最終的結果是相同的 - - 完成Web服務負載將觸發Main.mxml中的函數。但請注意mywrapper_webServiceComplete()是如何私下聲明的 - 它不會被MyWrapperClass直接調用。當MyWrapperClass完成其工作時,Main.mxml只需訂閱(與addEventListener()),然後完成自己的工作; MyWrapperClass對Main.mxml的實現細節一無所知,Main.mxml也不瞭解MyWrapperClass的任何內容,只是它分派了一個webserviceComplete事件,並公開了一個公開的doWork()方法。行動中隱藏的耦合和信息隱藏。

祝你好運!

6

如果您的類是添加到組件樹的UIComponent,那麼您可以使用它的parentApplication屬性。否則,請使用靜態Application.application屬性,但僅在應用程序初始化完成後。在此之前,該字段爲null。私人領域和方法顯然無法訪問。在MXML部分聲明的元素明確地爲id s是公共的。

雖然添加這樣的調用會創建一個剛性綁定。您可能需要考慮調度事件,並在主應用程序中處理此事件。

1

如果任何人有同樣的問題:

mx.core.FlexGlobals.topLevelApplication.YOUR_FUNCTION

是在main.mxml中訪問公共函數的語法。