我正在研究一组我在不同AS3项目中经常使用的“通用”类。其中一个类是Image类(扩展MovieClip),它只接受一个URL,生成一个加载器而不是加载它并将其作为子项添加。为了使它更通用,我想添加一个回调作为一个参数,可以包含与调整图像大小相关的某些消息等(我无法调整任何Image之前加载器中的加载器,因为它的宽度和高度将是0直到那时所以有必要等待加载和处理这些操作使用父MovieClips中的事件监听器是不方便的,如果有大量的图像被加载)。
这是我目前的实施:
public class Image extends MovieClip {
public var self:MovieClip; //fixes scope issues when nesting functions
private var url:String;
private var callback:Function;
public function Image(url:String, callback:Function) {
this.self = this; //fixes scope issues when nesting functions
this.url = url;
this.callback = callback;
this.loadAndDraw();
}
public function loadAndDraw():void {
var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(Event.COMPLETE, function doneLoading(evt:Event) {
self.addChild(evt.currentTarget.loader);
callback();
});
l.load(new URLRequest(this.url));
}
}
现在,问题是我在编写回调函数时遇到了麻烦。我不确定我是怎么指代“来电者”的,这让我觉得有更好的办法。你有什么建议?
答案 0 :(得分:2)
您可以在回调函数中传递对Image
实例的引用。
public class Image extends MovieClip {
public var self:MovieClip; //fixes scope issues when nesting functions
private var url:String;
private var callback:Function;
public function Image(url:String, callback:Function) {
this.self = this; //fixes scope issues when nesting functions
this.url = url;
this.callback = callback;
this.loadAndDraw();
}
public function loadAndDraw():void {
var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(Event.COMPLETE, function doneLoading(evt:Event) {
self.addChild(evt.currentTarget.loader);
callback(self);
});
l.load(new URLRequest(this.url));
}
}
然后,您的callback
函数必须接受它作为参数:
var someImage:Image = new Image("http://some.valid.url/image.jpg", someCallback);
private function someCallback($caller:Image):void
{
// do something with $caller...
}