2013-10-30 49 views
0

這是我涉及閃存外部類的第一個項目,所以這可能是一個相當基本的問題: 我試圖加載的類CSVloader csv文件:AS3無法加載一個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(「一些網址」)我得到一個數組與所有的數據?

這是我的AppController類:

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")); 
    } 

} 

}

回答

0

你真的不能從事件偵聽器返回的數據就像你做一個正常的功能,因爲它們是異步調用(他們不叫權遠)。當csv數據準備就緒時,您需要做的是從CSVLoader發送一個事件。

CSVLoader需要擴展EventDispatcher,以便它可以派發事件。添加到您的進口:

import flash.events.EventDispatcher; 

讓CSVLoader擴展EventDispatcher並添加類屬性來保存CSV數據:

public class CSVLoader extends EventDispatcher { 
    public var csvData = []; 
    ... 

onCSVDataReady(),不創建一個新的數組來保存數據,使用您在上面聲明的財產。 在的onCSVDataReady()末,刪除您return語句,並添加:

dispatch(new Event(Event.COMPLETE)); 

不要忘了更改方法聲明爲void返回類型。你也應該刪除你現在所有的返回語句,因爲它們不會返回任何東西。

然後在AppController中做到這一點:

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); 
} 

理想情況下,你會做csvData在CSVLoader private,且getter方法來訪問它,但我確實是這樣爲了簡潔。