自从我一年前参加AS3以来,这一直困扰着我。
实施例。我创建了一个扩展Movie Clip的类,并将其命名为“LoaderBar
”,它只是一些文字说“正在加载”,而在它下面是另一个我称之为“lBar
的纯矩形的影片剪辑” “
当我调用一个函数来加载我的图像时,我将Loader添加到舞台上......
function imageLoader(URL:String):void
{
var loader:Loader = new Loader(new URLRequest(URL));
loader.contentLoaderInfo.addEventListner(ProgressEvent.PROGRESS, progressHandler);
var loadBar:Loader Bar = new LoaderBar();
addChild(loadBar);
}
function progressHandler(e:Event):void
{
var pcent:Number = e.getBytesLoaded / e.getBytesTotal;
// HERE IS WHERE I'D LIKE TO MAKE DIRECT REFERENCE TO MY LOADBAR;
loadBar.lBar.width = pcent*100;
}
基本上我只是想告诉loadBar Movie Clip中的lBar
是百分比* 100的宽度。 (这样当加载剪辑时,加载条的宽度为100像素)。
我的问题是这个。当我将loadBar添加到一个函数的stage中时,我不能在另一个函数内部引用它而不做一些hack在我的函数之外创建一个全局变量...
var loadBarClip:MovieClip;
并在加载函数内部将loadBar
分配给loadBarclip
本身
loadBarClip = loadBar.
我觉得这是多余的。有没有人知道在没有制作参考变量的情况下访问我的loadBar
?
答案 0 :(得分:2)
我没有看到在imageLoader函数之外声明变量的主要问题。如果你是在一个类而不是时间轴中写这个,那么它只是一个类成员变量,并没有任何问题。它们存在就是出于这个原因。
如果你的死机想要将loadBar变量保持在本地,那么你总是可以这样做:
在imageLoader函数中:
var loadBar:Loader Bar = new LoaderBar();
loadBar.name = "loadBar";
addChild(loadBar);
getChildByName("loadBar");
答案 1 :(得分:2)
如果只是为了那个处理程序,你可以使处理程序匿名并保持在当前作用域内。
var loadBar = new LoaderBar();
var loader:Loader = new Loader(new URLRequest(URL));
loader.contentLoaderInfo.addEventListner(
ProgressEvent.PROGRESS, function (e:Event):void {
var pcent:Number = e.getBytesLoaded / e.getBytesTotal;
loadBar.lBar.width = pcent*100; //Here you are making a direct reference.
}
);
如果你真的想要封装你的范围你可以使用闭包:
returnFromEncapulatingClosure = function(){
var loadBar = new LoaderBar();
var loader:Loader = new Loader(new URLRequest(URL));
return {
loadBar: loadBar,
loader: loader
};
}();
这允许你将一些引用捆绑在一起,这样它们就不会破坏代码的其他部分,你可以用它来引用它:
returnFromEncapulatingClosure.loader.contentLoaderInfo.addEventListner(ProgressEvent.PROGRESS, progressHandler);
function progressHandler(e:Event):void {
var pcent:Number = e.getBytesLoaded / e.getBytesTotal;
returnFromEncapulatingClosure.loadBar.lBar.width = pcent*100;
}
作为脚注,当您扩展Movie Clip时,添加一个设置lBar.width的方法。类似的东西:
loadbar.setLBarWidth = function (w:number) {
this.lBar.width = w;
}
答案 2 :(得分:1)
由于lBar(或loadBar)是您需要在类级别管理的元素,因此您应该确实将其作为类成员。它没有任何问题;)