Pregunta

¿Es posible usar EventListener para escuchar una variable y detectar cuándo cambia el valor de esa variable? Gracias.

¿Fue útil?

Solución

Esto es bastante fácil de hacer si lo envuelve todo en una clase. Usaremos métodos getter / setter. El método setter despachará y sucederá cada vez que se llame.

(Nota: los Setters y Getters son tratados como propiedades) Simplemente asigna un valor, en lugar de llamar a un método (por ejemplo, someVar = 5 en lugar de someVar (5); Aunque los setters / getters son funciones / métodos, son tratados como propiedades.

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

Otros consejos

@BrianHodge: ¿Cómo usas realmente tu ejemplo? ¿Cómo se llama a la función set? ¿Cómo te refieres a eso? ¿Dónde se pasa la variable a cambiar ...?

Digamos si quiero cambiar la variable envuelta con un clic de botón, por ejemplo. Tengo que confesar que probé algunos otros códigos y tipos de ejemplo (getter / setter), con dispatchEvent o sin ellos, ¡y no puedo superarlo! Pero su ejemplo parece ser exactamente lo que necesito, simplemente no puedo hacer que funcione.

Obtengo el El modelo fue instanciado cuando configuro la función como clase de documento. Eso es todo.

¡Por fin descubrí a personas como yo que están perdiendo el tiempo con esta tarea de despacho!
En mi caso, la variable _someVar tiene que ser datos escritos como String (lo mismo para fornewVal ).

OnceTestDocClass se establece como su clase de documento; te refieres al modelo instanciado así:

_model.someVariable="new stuff";  

Estaba tratando de cambiar el valor de esta manera:

_model.someVariable("new stuff");  

Puede agregar algunas acciones de rastreo en la clase Modelo para tener una demostración clara en el panel de salida:

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

No es mucho, pero estas cosas pueden costar mucho tiempo a algunas personas =)

Solías poder hacer algo similar en AS2 usando Object.watch. No veo un equivalente directo, pero parece que mx.binding.utils.ChangeWatcher le dará una funcionalidad similar para cualquier variable que se pueda enlazar.

No conozco una forma de hacerlo en AS3 para variables no vinculables, pero si la variable que desea ver es vinculable (o si puede modificarla para que sea vinculable), entonces ChangeWatcher podría darle lo que usted desea. querer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top