Actionscript 3 在eventListener之后更新变量
我使用FileReference从用户处读取文件。我有一个变量,我想用所选文件的内容初始化它。我创建了一个带有setter和getter的模型类。虽然这实际上不起作用,因为它向我抛出了一个错误,告诉我已到达文件的末尾。如何使用该文件更新变量?多谢各位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
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");
}
}
}
}