AS3 - 我可以使用addEventListener检测变量值的变化吗?
如果将它全部包装到一个类中,这很容易做到。我们将使用getter/setter方法。无论何时被调用,setter方法都会分派和事件。
(注意:Setters和Getters被视为属性)。你只是分配一个值,而不是调用一个方法(例如someVar = 5
代替someVar(5);
即使制定者/吸气剂函数/方法,他们像对待性质
//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));
}
}
}
您曾经能够使用Object.watch在AS2中做类似的事情。我没有看到直接的等价物,但它看起来像mx.binding.utils.ChangeWatcher会给你任何可绑定变量的类似功能。我不知道如何在AS3中为非可绑定变量执行此操作,但是如果要观看的变量是可绑定的(或者如果您可以将其修改为可绑定变量),那么ChangeWatcher可能会为您提供什么你要。
@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));
}
}
}
这不是很多,但这些东西可以花费一些人一大堆的时间=)
是的 - 我很想看到一个这样的工作示例。我正在尝试加入一个命中测试。当用户在一个项目上时,有一个ENTER_FRAME监听器注册一个常量“命中”值,但是当它们关闭时,监听器改变注册一个常量“off”值。这种情况将如何适用于您的模型? – mheavers 2011-06-22 17:56:22