能否使用EventListener监听变量,并在该变量的值更改时检测到?谢谢。
能否使用EventListener监听变量,并在该变量的值更改时检测到?谢谢。
如果将所有内容封装成一个类,那么这将非常容易。我们将使用getter/setter方法。每当调用setter方法时,它都将分派一个事件。
(注意:设置器和获取器被视为属性)。您只需赋值,而不是调用方法(例如 someVar = 5
而不是 someVar(5);
)即可。尽管setter/getter是函数/方法,但它们被视为属性。
//The document class
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.EventDispatcher;
public Class TestDocClass extends Sprite
{
private var _model:Model;
public function TestDocClass():void
{
_model = new Model();
_model.addEventListener(Model.VALUE_CHANGED, onModelChanged);
}
private function onModelChanged(e:Event):void
{
trace('The value changed');
}
}
}
//The model that holds the data (variables, etc) and dispatches events. Save in same folder as DOC Class;
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class Model extends EventDispatcher
{
public static const VALUE_CHANGED:String = 'value_changed';
private var _someVar:someVarType;
public function Model():void
{
trace('The model was instantiated.');
}
public function set someVariable(newVal:someVarType):void
{
_someVar = newVal;
this.dispatchEvent(new Event(Model.VALUE_CHANGED));
}
}
}
@BrianHodge: 你的示例应该如何使用?如何调用set函数?如何引用它?在哪里传递要更改的变量..?
比如说,如果我想通过单击按钮来更改包装变量。 我必须承认,我尝试了一些其他代码和示例(getter/setter类型),使用dispatchEvent或不使用,但我无法克服它!但是您的示例似乎正是我所需要的,只是无法使其工作。
当我将函数设置为文档类时,我得到了“模型已实例化”的消息。仅此而已。
最后,我发现像我这样浪费时间处理这个分派问题的人们的解决方案!
在我的情况下,_someVar变量必须被数据类型化为String(对于fornewVal也是同样的情况)。
一旦设置了OnceTestDocClass作为您的文档类,您可以像这样引用实例化的Model:
_model.someVariable="new stuff";
我试图像这样更改值:
_model.someVariable("new stuff");
您可以在Model
类中添加一些跟踪操作,以便在输出面板中获得清晰的演示:
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class Model extends EventDispatcher
{
public static const VALUE_CHANGED:String = 'value_changed';
private var _someVar:String = "default";
public function Model():void
{
trace('The model was instantiated.');
}
public function set someVariable(newVal:String):void
{
trace ("before " + _someVar);
_someVar = newVal;
trace ("after " + _someVar);
this.dispatchEvent(new Event(Model.VALUE_CHANGED));
}
}
}
虽然这不算什么,但对于一些人来说,这些东西可能会花费大量时间 =)
在AS2中,您曾经可以使用Object.watch来执行类似的操作。我没有看到直接等效的方法,但是看起来mx.binding.utils.ChangeWatcher将为任何可绑定变量提供类似的功能。
我不知道如何在AS3中对非可绑定变量执行此操作,但如果您想要监视的变量是可绑定的(或者如果您可以修改它以使其可绑定),那么ChangeWatcher可能会给您想要的结果。