AS3 - 我可以使用addEventListener检测变量值的变化吗?

时间:2008-11-20 21:24:13

标签: actionscript-3 addeventlistener

是否可以使用EventListener侦听变量并检测该变量的值何时发生变化?感谢。

3 个答案:

答案 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可能会为您提供想。