这是我的第一个涉及flash外部类的项目,所以这可能是一个相当基本的问题:我正在尝试在 CSV 加载器类中加载一个 csv 文件:
package Application {
import flash.events.Event;
import flash.display.Loader;
import flash.filesystem.File;
import flash.net.*;
import Application.*;
public class CSVloader {
private var waiting = true;
private var CSVdata:Array;
private var myCsvLoader:URLLoader = new URLLoader;
public function CSVloader() {
}
public function loadCSV(Args:String){
myCsvLoader.dataFormat = URLLoaderDataFormat.TEXT;
myCsvLoader.load(new URLRequest(Args));
myCsvLoader.addEventListener(Event.COMPLETE, onWait);
return CSVdata;
}
public function onCSVLoaderReady():Array {
var CSVdata:Array;
var str:String = myCsvLoader.data as String;
CSVdata = str.split("n");
for (var i:int=0; i<CSVdata.length; i++) {
CSVdata[i] = CSVdata[i].split(';');
}
for(var q:int = 0; q<(CSVdata.length-1);q++){
CSVdata[q][1] = CSVdata[q][1].slice(0,-1);
}
trace("CSV loaded! : " + CSVdata);
return CSVdata;
}
private function onWait(e:Event):void{
CSVdata = onCSVLoaderReady();
}
}
}
如何编写 CSVloader类,以便当我调用 CSVloader("some url") 时,我得到一个包含所有数据的数组?
这是我的应用控制器类:
package{
import Application.CSVloader;
import Application.C;
import flash.display.MovieClip;
public class AppController extends MovieClip{
public function AppController() {
// constructor code
}
public function init(){
var myCSVLoader = new CSVloader();
trace(myCSVLoader.loadCSV("data.csv"));
}
}
}
您不能像执行普通函数那样真正从事件侦听器返回数据,因为它们是异步调用的(它们不会立即调用)。您需要做的是在 csv 数据准备就绪时从 csvloader 调度事件。
CSVLoader 需要扩展 EventDispatcher,以便它可以调度事件。将此添加到您的导入中:
import flash.events.EventDispatcher;
使 CSVLoader 扩展 EventDispatcher 并添加一个类属性来保存 csv 数据:
public class CSVLoader extends EventDispatcher {
public var csvData = [];
...
在 onCSVDataReady()
中,不要创建新数组来保存数据,请使用上面声明的属性。在onCSVDataReady()
末尾,删除您的返回语句并添加:
dispatch(new Event(Event.COMPLETE));
不要忘记将方法声明中的返回类型更改为 void。您还应该删除您现在拥有的所有 return 语句,因为它们不会返回任何内容。
然后在应用程序控制器中执行以下操作:
private var myCSVLoader = new CSVLoader();
public function init(): void {
myCSVLoader.addEventListener(Event.COMPLETE, completeListener);
myCSVLoader.loadCSV("data.csv");
}
private function completeListener(evt: Event): void {
trace(myCSVLoader.csvData);
}
理想情况下,您将CSVLoader中的csvData设为私有,并创建一个getter方法来访问它,但是为了简洁起见,我这样做了。