AS3 — Могу ли я обнаружить изменение значения переменной с помощью addEventListener?

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


person shibbydoo    schedule 20.11.2008    source источник


Ответы (3)


Это довольно легко сделать, если вы обернете все это в класс. Мы будем использовать методы getter/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));
    }
  }
}
person Brian Hodge    schedule 25.11.2008
comment
Да, я хотел бы увидеть рабочий пример этого. Я пытаюсь включить тест на попадание. Когда пользователь находится над элементом, прослушиватель ENTER_FRAME регистрирует постоянное значение попадания, но когда они выключены, прослушиватель изменяется, чтобы зарегистрировать постоянное значение отключения. Как этот сценарий применим к вашей модели? - person mheavers; 22.06.2011

@BrianHodge: Как вы на самом деле используете свой пример? Как вы вызываете функцию множества? Как вы к этому относитесь? Куда передать переменную для изменения ..?

Скажем, если я хочу изменить обернутую переменную, например, нажатием кнопки. Я должен признаться, что я пробовал некоторые другие коды и примеры (геттер/сеттер), с 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));
    }
  }
}

Это немного, но некоторые вещи могут стоить уйму времени =)

person Community    schedule 24.04.2009

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

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

person Herms    schedule 20.11.2008