在eventListener之后更新变量

时间:2012-05-19 07:53:15

标签: actionscript-3 event-listener

我使用FileReference从用户读取文件。我有一个变量,我想用所选文件的内容初始化。我创建了一个带有setter和getter的Model类。虽然这不起作用,因为它会告诉我一个错误,告诉我文件的末尾已到达。如何用文件更新变量?谢谢。

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

2 个答案:

答案 0 :(得分:0)

在读取utf字节时使用“content.bytesAvailable”。

答案 1 :(得分:0)

那里你有一个错误:

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

请注意,两个事件都会触发相同的处理程序 这显然不是你想要的。

顺便说一句,在新加载的readUTFBytes()上调用ByteArray是好的(因为位置最初为零),通常在阅读之前设置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");
            }
        }
    }
}