2008-11-20 11 views

Odpowiedz

14

Jest to dość łatwe do zrobienia, jeśli opakujesz wszystko w klasę. Będziemy używać metod getter/setter. Metoda ustawiająca będzie wysyłana i wywoływana za każdym razem, gdy zostanie wywołana.

(Uwaga: setery i kolekcje są traktowane jak właściwości). Ty tylko przypisać wartość, w przeciwieństwie do wywołania metody (np someVar = 5 zamiast someVar(5); Nawet ustawiaczy/getters są funkcje/metody, są one traktowane jak właściwości

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

Tak, chciałbym zobaczyć działający przykład tego. Próbuję włączyć test trafienia. Gdy użytkownik znajduje się nad elementem, istnieje detektor ENTER_FRAME rejestrujący stałą wartość "trafienia", ale gdy są wyłączone, słuchacz zmienia się, aby zarejestrować stałą wartość "wyłączenia". Jak ten scenariusz miałby zastosowanie do twojego modelu? – mheavers

1

Zwykle robiłeś coś podobnego w AS2 przy użyciu Object.watch. Nie widzę bezpośredniego odpowiednika, ale wygląda na to, że mx.binding.utils.ChangeWatcher zapewnia podobną funkcjonalność dla wszystkich zmiennych, które można powiązać.

Nie wiem, jak to zrobić w AS3 w przypadku zmiennych niezwiązanych, ale jeśli zmienna, którą chcesz obejrzeć, jest wiążąca (lub jeśli możesz ją zmodyfikować w celu kompilacji), wówczas ChangeWatcher może dać ci chcesz.

2

@BrianHodge. Jak właściwie używać swojego Przykład: jak wywołać funkcję set? Jak się do niej odnosić? Gdzie przekazać zmienną do zmiany?

Powiedzmy, że jeśli chcę zmienić zmienną owiniętą za pomocą kliknięcia przycisku, na przykład. Muszę wyznać, że próbowałem innych kodów i przykładu (getter/setter) typu, z dispatchEvent lub bez, i nie mogę się z tym pogodzić! Ale twój przykład wydaje się być dokładnie tym, czego potrzebuję, po prostu nie może sprawić, żeby działało.

Po ustawieniu funkcji jako klasy dokumentu otrzymuję The model was instantiated. To wszystko.

Dowiedziałem się wreszcie o ludziach takich jak ja, którzy tracą czas na wysyłkę!
W moim przypadku zmienna _someVar musi być danymi wpisanymi jako String (to samo dla fornewVal).

OnceTestDocClass jest ustawiona jako klasa dokumentu; odwołać się do modelu instancja tak:

_model.someVariable="new stuff"; 

starałem się zmienić wartość takiego:

_model.someVariable("new stuff"); 

Można dodać kilka działań śladowych w klasie Model mieć jasną prezentację w panel wyjście:

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

To nie jest dużo, ale te rzeczy mogą kosztować trochę ludziom dużo czasu =)

Powiązane problemy