AS3 - Могу ли я обнаружить изменение значения переменной, используя addEventListener? - PullRequest
10 голосов
/ 21 ноября 2008

Можно ли использовать EventListener для прослушивания переменной и определения, когда значение этой переменной изменяется? Спасибо.

Ответы [ 3 ]

14 голосов
/ 25 ноября 2008

Это довольно легко сделать, если вы заключите все это в класс. Мы будем использовать методы получения / установки. Метод setter отправляет и обрабатывает каждый раз, когда он вызывается.

(Примечание: сеттеры и геттеры рассматриваются как свойства). Вы просто присваиваете значение, а не вызываете метод (например, 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));
    }
  }
}
2 голосов
/ 25 апреля 2009

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

Это не так много, но некоторым людям это может стоить много времени =)

1 голос
/ 21 ноября 2008

Раньше вы могли делать что-то подобное в AS2, используя Object.watch. Я не вижу прямого эквивалента, но похоже, что mx.binding.utils.ChangeWatcher даст вам аналогичную функциональность для любых переменных, которые могут быть привязаны.

Я не знаю, как это сделать в AS3 для не привязываемых переменных, но если переменная, которую вы хотите просмотреть, является привязываемой (или если вы можете изменить ее так, чтобы она была привязываемой), то ChangeWatcher может дать вам то, что вы хочу.

...