Actionscript 3 在eventListener之后更新变量

Actionscript 3 在eventListener之后更新变量,actionscript-3,event-listener,Actionscript 3,Event Listener,我使用FileReference从用户处读取文件。我有一个变量,我想用所选文件的内容初始化它。我创建了一个带有setter和getter的模型类。虽然这实际上不起作用,因为它向我抛出了一个错误,告诉我已到达文件的末尾。如何使用该文件更新变量?多谢各位 public class Main extends Sprite { public var fr:FileReference; private var _model:Model; private var button:Sp

我使用FileReference从用户处读取文件。我有一个变量,我想用所选文件的内容初始化它。我创建了一个带有setter和getter的模型类。虽然这实际上不起作用,因为它向我抛出了一个错误,告诉我已到达文件的末尾。如何使用该文件更新变量?多谢各位

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

读取utf字节时,请使用“content.bytesavable”。

这里有一个错误:

_model.addEventListener(Model.VALUE_CHANGED, fileLoaded); 
// ...
fr.addEventListener(Event.COMPLETE, fileLoaded);
请注意,这两个事件触发相同的处理程序。
这显然不是你想要的

顺便说一句,在新加载的
ByteArray
上调用
readUTFBytes()
是可以的(因为位置最初为零),通常最好在读取之前设置
位置。只是为了把事情弄清楚

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