我已经实例化了一个类(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
答案 0 :(得分: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);
}
}
}
希望这有帮助
答案 1 :(得分:1)
如果您希望Flex / FlashBuilder自动完成类的事件,可以在类定义之前使用“Event”元数据标记。根据上面的例子,它看起来像这样
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的更多信息。
希望有所帮助:)