是否可以使用EventListener侦听变量并检测该变量的值何时发生变化?感谢。
答案 0 :(得分:14)
如果将它全部包装到一个类中,这很容易做到。我们将使用getter / setter方法。无论何时调用setter方法,它都会调度和调度。
(注意:Setters和Getters被视为属性)。您只需指定一个值,而不是调用方法(例如someVar = 5
而不是someVar(5);
即使setter / getters是函数/方法,它们也会被视为属性。
//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));
}
}
}
答案 1 :(得分:2)
@BrianHodge:你如何实际使用你的例子?你怎么称呼set功能?你怎么称呼它?传递要变更的变量在哪里??
假设我想用按钮点击更改包装变量,例如。
我必须承认我尝试了一些其他代码和示例(getter / setter)类型,dispatchEvent
或没有,我无法克服它!但是你的例子似乎正是我所需要的,只是无法使它发挥作用。
当我将函数设置为文档类时,我得到了The model was instantiated
。就是这样。
最后,我发现像我这样的人正在放弃这个派遣的事情!
在我的情况下,_someVar
变量必须是String
的数据类型(fornewVal
的相同内容)。
OnceTestDocClass
被设置为您的文档类;你可以参考像这样实例化的模型:
_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));
}
}
}
这并不多,但是这些东西可能会花费很多人很多时间=)
答案 2 :(得分:1)
您曾经可以使用Object.watch在AS2中执行类似的操作。我没有看到直接的等价物,但看起来mx.binding.utils.ChangeWatcher将为任何可绑定的变量提供类似的功能。
我不知道在AS3中为不可绑定变量执行此操作的方法,但是如果要监视的变量是可绑定的(或者如果您可以将其修改为可绑定的),那么ChangeWatcher可能会为您提供想。