2009-12-13 64 views
0

我已經實例化了一個類(class1),它在AS3 Flex項目中通過PHP加載一些數據。 我實例化class1,它是異步的,並使用URLLoader()來獲取其數據。查詢類的偵聽器的狀態

然後我想實例化class2,它需要使用class1中的數據,但是當我簡單地實例化它時,我發現class1的實例變量尚未填充,因爲我太快地調用了class2。

如何創建這樣一個將正確鏈接的依賴關係? 我真的很習慣使用監聽器,但我想象的是class2中的監聽器可能是我需要的嗎? 或者也許我可以將class1中的監聽器的引用傳遞給class2? 我對調度事件一無所知......這是關鍵嗎?

下面是僞代碼的例子:

var class1:myC1 = new myC1("http://some/url/to/utilize"); 
//this never shows up because it hasn't loaded at the time i request it 
trace("the stuff from class1 is: ", class1.myXMLList); 
//and of course i can't use it here either 
var class2:myC2 = new myC2(0x000000, class1.myXMLList); 

感謝您的幫助, JML

回答

2

根據你的問題,我張貼這種「僞代碼」跳它會幫

package { 

    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.net.*; 

    public class Class1 extends EventDispatcher { 
    private var _loader:URLLoader; 

    public var data:XMLList; 

    public function Class1(url:String) { 
     _loader = new URLLoader(); 
     _loader.addEventListener(Event.COMPLETE, completeHandler); 
     // rest of the code here .... 

     _loader.load(new URLRequest(url)); 
    } 

    protected function completeHandler(event:Event):void { 
     data = new XMLList(_loader.data); // probably wrong but 
             // I figured you had already 
             // implemented this part 

     dispatchEvent(new Event(Event.COMPLETE)); 
    } 
    } 
} 

我想通2級可能是這樣的

package { 

    public class Class2 { 

    // your stuff here 

    public function Class2(color:uint, data:XMLList) { 

    } 
    } 

} 

主類

package { 

    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite { 

    public var c1:Class1; 
    public var c2:Class2; 

    public function Main() { 
     c1 = new Class1("http://some/url/to/utilize"); 
     c1.addEventListener(Event.COMPLETE, completeHandler); 
    } 

    protected function completeHandler(event:Event):void { 
     c2 = new Class2(0xffcc00, c1.data); 
    } 
    } 

} 

希望這有助於

+0

很酷。感謝提示。如果我有任何問題,我會檢查併發回。 非常感謝! btw-你有關於學習事件調度的任何鏈接? – jml 2009-12-13 18:00:40

1

如果你想的Flex/FlashBuilder自動完成的事件爲你的類,您可以在類定義之前使用的「事件」元數據標籤。根據上面的例子,它看起來像這樣

package { 

    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.net.*; 

    // use the "Event" metadata tag 

    [Event(name="complete", type="flash.events.Event")] 

    public class Class1 extends EventDispatcher { 

     private var _loader:URLLoader; 

     public var data:XMLList; 

     public function Class1(url:String) { 
      _loader = new URLLoader(); 
      _loader.addEventListener(Event.COMPLETE, completeHandler); 
      // rest of the code here .... 

      _loader.load(new URLRequest(url)); 
     } 

     protected function completeHandler(event:Event):void { 
      data = new XMLList(_loader.data); 
      dispatchEvent(new Event(Event.COMPLETE)); 
     } 
    } 
} 

現在的FlexBuilder/FlashBuilder應該「自動完成」的該類事件。 缺點是,你不能使用「常量」與「事件」元數據標籤所以這個:

[Event(name=Event.COMPLETE, type="flash.events.Event")] 

是行不通的。

你可以閱讀更多關於事件/事件調度here

希望能幫到:)

+0

是的,這絕對有幫助。非常感謝。 – jml 2010-01-06 20:10:50