2009-12-13 68 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