AS3 - 我能否使用addEventListener检测变量值的更改?

10

能否使用EventListener监听变量,并在该变量的值更改时检测到?谢谢。

3个回答

14

如果将所有内容封装成一个类,那么这将非常容易。我们将使用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));
    }
  }
}

1
是的 - 我很想看到一个这样的工作示例。我正在尝试整合一个命中测试。当用户在某个项目上方时,会有一个ENTER_FRAME侦听器注册一个恒定的“命中”值,但当他们离开时,侦听器会更改为注册一个恒定的“关闭”值。这种情况如何适用于您的模型? - mheavers

2

@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));
    }
  }
}

虽然这不算什么,但对于一些人来说,这些东西可能会花费大量时间 =)


1

在AS2中,您曾经可以使用Object.watch来执行类似的操作。我没有看到直接等效的方法,但是看起来mx.binding.utils.ChangeWatcher将为任何可绑定变量提供类似的功能。

我不知道如何在AS3中对非可绑定变量执行此操作,但如果您想要监视的变量是可绑定的(或者如果您可以修改它以使其可绑定),那么ChangeWatcher可能会给您想要的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接