Frage

Ist es möglich, Eventlistener zu verwenden, um eine Variable zu hören und erkennen, wenn der Wert dieser Variablen ändern? Danke.

War es hilfreich?

Lösung

Das ist ganz einfach zu tun, wenn man sie alle in eine Klasse wickeln. Wir werden Getter / Setter-Methoden verwenden. Die Setter-Methode versenden und Ereignis, wenn sie aufgerufen wird.

(Hinweis: Getter und Setter sind ähnliche Eigenschaften behandelt). Sie weisen lediglich einen Wert, im Gegensatz ein Verfahren (z someVar = 5 statt someVar(5); Selbst zu nennen, obwohl Setter / Getter Funktionen / Methoden, sie ähnliche Eigenschaften behandelt werden.

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

Andere Tipps

@BrianHodge: Wie verwenden Sie eigentlich Ihr Beispiel? Wie nennt man die eingestellte Funktion? Wie finden Sie das? Wo das Variable tun passieren zu ändern ..?

Lassen Sie uns sagen, wenn ich die verpackte Variable mit einem Knopf klicken, zum Beispiel ändern möchten. Ich muss zugeben, dass ich einige andere Codes und Beispiel (Getter / Setter) Typ versucht, mit dispatchEvent oder ohne, und ich kann über sie nicht bekommen! Aber Ihr Beispiel scheint genau das zu sein, was ich brauche, kann einfach nicht damit es funktioniert.

Ich erhalte die The model was instantiated wenn ich die Funktion als Dokumentenklasse festgelegt. Das ist alles.

Ich fand heraus, endlich, für Leute wie ich, die Zeit mit diesem Versand Sache verlieren!
In meinem Fall hat die _someVar Variable als String (gleiche Sache für fornewVal) werden Daten eingegeben hat.

OnceTestDocClass als Dokumentenklasse festgelegt; Sie beziehen sich auf das Modell wie folgt instanziiert:

_model.someVariable="new stuff";  

Ich habe versucht, den Wert wie folgt zu ändern:

_model.someVariable("new stuff");  

Sie können einige Spuren Aktionen in der Model Klasse hinzufügen eine klare Demo im Ausgabefeld haben:

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

Es ist nicht viel, aber diese Dinge können einige Leute eine ganze Menge Zeit kosten =)

Sie verwendet, um der Lage sein, etwas Ähnliches in AS2 Object.watch zu tun. Ich sehe nicht, eine direkte Entsprechung, aber es sieht aus wie mx.binding.utils.ChangeWatcher werden Sie eine ähnliche Funktionalität für alle Variablen geben, die bindable sind.

Ich weiß nicht, von einer Art und Weise es in AS3 für nicht-bindungsfähigen Variablen zu tun, aber wenn die Variable, die Sie sehen wollen, ist bindable (oder, wenn Sie es binadable ändern kann sein), dann könnte Change Ihnen, was Sie möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top