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

StackOverflow https://stackoverflow.com/questions/306896

  •  08-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

Скажем, если я хочу изменить обернутую переменную, например, нажатием кнопки. Я должен признаться, что я пробовал некоторые другие коды и примеры (getter / setter) типа, с dispatchEvent или без, и я не могу преодолеть это! Но ваш пример, кажется, именно то, что мне нужно, просто не могу заставить его работать.

Я получил Модель была создана , когда я установил функцию в качестве класса документа. Вот и все.

Наконец-то я узнал о людях, подобных мне, которые теряют время из-за этой отправки!
В моем случае переменная _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));
    }
  }
}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top