2012-05-19 2 views
0

FileReference를 사용하여 사용자로부터 파일을 읽었습니다. 선택한 파일의 내용으로 초기화하려는 변수가 있습니다. 나는 setters와 getters를 가진 Model 클래스를 만든다. 이것은 파일의 끝 부분에 도달했다는 오류를 던져 버리기 때문에 실제로 작동하지는 않지만. 변수를 파일로 업데이트하려면 어떻게해야합니까? 고맙습니다.eventListener 뒤 변수 업데이트

public class Main extends Sprite 
{ 
    public var fr:FileReference; 
    private var _model:Model; 
    private var button:Sprite; 

    public function Main():void 
    { 
     _model = new Model(); 
     _model.addEventListener(Model.VALUE_CHANGED, fileLoaded); 
     trace(_model.getVariable()); 
    } 
    protected function loadClicked(e:Event):void 
    { 
     fr = new FileReference(); 
     fr.addEventListener(Event.SELECT, fileSelected); 
     fr.browse([new FileFilter("JSON Files (*.json)", "*.json")]); 
    } 
    public function fileSelected(event:Event):void 
    { 
     fr.addEventListener(Event.COMPLETE, fileLoaded); 
     fr.load(); 
    } 
    public function fileLoaded(event:Event):void 
    { 
     try 
     { 
      var content:ByteArray = fr.data; 
      _model.setVariable(content.readUTFBytes(content.length)); 
     } 
     catch (e:Error) 
     { 
      trace("Error"); 
     } 
    } 
} 

public class Model extends EventDispatcher 
{ 
    public static const VALUE_CHANGED:String = "value_changed"; 
    private var variable:String; 
    public function Model() :void 
    { 

    } 
    public function setVariable(newVar:String):void 
    { 
     variable = newVar; 
     this.dispatchEvent(new Event(Model.VALUE_CHANGED)); 
    } 
    public function getVariable():String { 
     return variable; 
    } 
} 

답변

0

당신이 실수 있습니다.
이것은 분명히 원하는 것이 아닙니다.

그리고 btw는 새로로드 된 ByteArray에 대해 readUTFBytes()을 호출하는 동안 Ok입니다 (위치가 처음에는 0 임). 일반적으로 읽을 때까지 position을 설정하는 것이 좋습니다. 일을 분명히하는 것.

var content:ByteArray = fr.data; 
content.position = 0; 
_model.setVariable(content.readUTFBytes(content.length)); 
코드의

수정 버전 :

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.utils.ByteArray; 

    [SWF(width="800", height="600")] 
    public class Main extends Sprite 
    { 
     public var fr:FileReference; 
     private var _model:Model; 
     private var button:Sprite; 

     public function Main():void 
     { 
      _model = new Model(); 
      _model.addEventListener(Model.VALUE_CHANGED, valueChanged); 
      stage.addEventListener(MouseEvent.MOUSE_DOWN, loadClicked); 
      trace(_model.getVariable()); 
     } 

     protected function valueChanged(event:Event):void 
     { 
      trace(_model.getVariable()); 
     } 
     protected function loadClicked(e:Event):void 
     { 
      fr = new FileReference(); 
      fr.addEventListener(Event.SELECT, fileSelected); 
      fr.browse([new FileFilter("JSON Files (*.json)", "*.json")]); 
     } 
     public function fileSelected(event:Event):void 
     { 
      trace(event.type); 
      fr.addEventListener(Event.COMPLETE, fileLoaded); 
      fr.load(); 
     } 
     public function fileLoaded(event:Event):void 
     { 
      trace(event.type); 
      try 
      { 
       var content:ByteArray = fr.data; 
       content.position = 0; 
       _model.setVariable(content.readUTFBytes(content.length)); 
      } catch (e:Error) { 
       trace("Error"); 
      } 
     } 
    } 
} 
0

utf 바이트를 읽을 때 "content.bytesAvailable"을 사용하십시오. 두 이벤트 모두 동일한 핸들러를 트리거 것을,

_model.addEventListener(Model.VALUE_CHANGED, fileLoaded); 
// ... 
fr.addEventListener(Event.COMPLETE, fileLoaded); 

주의 사항 :