Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-02-2012, 20:13   #1 (permalink)
Neuer User
 
Registriert seit: May 2004
Beiträge: 13
Question Binding in Deep (Bind to items of map)

--> Anhänge: sourcen und libs als zip / Printscreen der PersonModel.as Klasse

Szenario:
Mein Ziel ist es eine "Base-Model" Klasse als "Super-Klasse" für alle meine Modelle zu implementieren.
Dieses "Base-Model" hat einige features, eins davon ist, dass ich für ein property zwei Werte halte. Einmal den originalen Wert, und einmal den geänderten. Damit habe ich den Vorteil das ich "save", "restore" Funktionalität anbieten kann und in einem Databinding auf den originalen oder den geänderten Wert binden kann (typisches Beispiel: View bindet auf originalen wert / Editor bindet auf den geänderten Wert)

Die geänderten Werte halte ich in einer Map (Ich verwende als Collection-Library die as3Commons-Collection library).
Wenn ich einen Wert eines properties ändere (den "geänderten Wert"), dann wird der Wert in der Map mit dem Property Key (als Konstante im Model gehalten) mit dem neuen Wert überschrieben und ein PropertyChange event ausgelöst.
Auf diese ChangeEvents binde ich dann über die "ChangeWatcher" Klasse meine Handler in denen ich in einem ersten Schritt nur ein Log-Statement erzeuge.

Problem:
Ich schaffe es nicht einen propertyChangeEvent für ein einzelnes Property abzufangen.

Vorgehen:
  1. Binding erstellen über ChangeWatcher.watch(...)
    Code:
    ChangeWatcher.watch(model, PersonModel.P_EDITED_VALUES, onCollectionChanged);
    ChangeWatcher.watch(model, [PersonModel.P_EDITED_VALUES, {name:PersonModel.P_FIRST_NAME, getter:getGetterFunctionForMap(), setter:getSetterFunctionForMap()}], onEditedNameChanged);
    ChangeWatcher.watch(model, [PersonModel.P_EDITED_VALUES, {name:PersonModel.P_AGE, getter:getGetterFunctionForMap(), setter:getSetterFunctionForMap()}], onEditedAgeChanged);
  2. Handler Methoden erstellen
    Code:
    private function onCollectionChanged(event : PropertyChangeEvent) : void {
          LOG.debug("onCollectionChanged(): <{0}> / <{1}>", [event.property, (event.newValue != null ? ((event.newValue as LinkedMapFx).size) : "<null>")]);
    }
    
    private function onEditedNameChanged(event : PropertyChangeEvent) : void{
          LOG.debug("onEditedNameChanged()");
    }
    
    private function onEditedAgeChanged(event : PropertyChangeEvent) : void {
          LOG.debug("onEditedAgeChanged()");
    }
  3. Applikation starten und über einen Button den Wert für das Property PersonModel.P_FIRST_NAME ändern
    Code:
    private function changeName() : void {
         var map : LinkedMapFx = model.editedValues;
         if (map.hasKey(PersonModel.P_FIRST_NAME){
               map.replaceFor(PersonModel.P_FIRST_NAME, "name" + nameCounter++);
         } else {
               map.add(PersonModel.P_FIRST_NAME, "name" + nameCounter++);
         }
    }
    Führe ich den Code aus erhalte ich die folgenden Log-Staements:
    Zitat:
    BindSample.swf(20:53:23.915) PersonModel: onEditedValueChanged
    BindSample.swf(20:53:23.916) BindSample: onCollectionChanged():<editedValues> / <1>
    BindSample.swf(20:53:23.916) BindSample: onEditedNameChanged()
    BindSample.swf(20:53:23.916) BindSample: onEditedAgeChanged()

Ich möchte aber das wenn ich einen Wert eines properties ändere nur dieses eine Property einen Event auslöst, das heisst ich möchte beim ändern des Namens nur das folgende Log-Statement sehen:
Zitat:
BindSample.swf(20:53:23.915) PersonModel: onEditedValueChanged
BindSample.swf(20:53:23.916) BindSample: onEditedNameChanged()
Meine Annahme:

Über das Binding, welches im ChangeWatcher erstellt wurde, wird auf Events vom Typ "PropertyChangeEvent" gehört. Aber ich verstehe nicht wie ich ein "Deep Binding" über mehrere "hierarchische" Stufen realisieren kann.
Wenn wir noch einmal anschauen wie das binding erstellt wird, hoffe ich, ist klar was ich machen will.
Code:
ChangeWatcher.watch(model, [PersonModel.P_EDITED_VALUES, {name:PersonModel.P_FIRST_NAME, getter:getGetterFunctionForMap(), setter:getSetterFunctionForMap()}], onEditedNameChanged);
Ich denke der Fehler liegt in dieser Methode der PersonModel.as Klasse:
Code:
private function onEditedValueChanged(event : MapEvent) : void {
      LOG.debug("onEditedValueChanged");
       dispatchEvent(PropertyChangeEvent.createUpdateEvent(this, P_EDITED_VALUES, null, _editedValues));
}
Der update event sollte wohl auf eine Chain (P_EDITED_VALUES.P_FIRST_NAME) oder so ähnlich verweisen, das hat aber nicht funktiniert.

Ich bedanke mich schon im voraus auf wertvolle Tipps, ich weiss nicht mehr weiter.

Anmerkung:
Ich habe auch schon versucht einen "custom-event" zu dispatchen, welcher im Bindable Tag [Bindable(event="customEvent"] eines Properties registriert wird.
Angehängte Grafiken
Dateityp: jpg 20120206-brhws8y37771h54imutktas7g5.jpg (63,1 KB, 3x aufgerufen)
Angehängte Dateien
Dateityp: zip supportBindingSample.zip (202,1 KB, 4x aufgerufen)
Michael Wittwer ist offline   Mit Zitat antworten
Alt 06-02-2012, 20:18   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Und das PersonModel sieht wie aus?
Omega Psi ist offline   Mit Zitat antworten
Alt 06-02-2012, 20:20   #3 (permalink)
Neuer User
 
Registriert seit: May 2004
Beiträge: 13
Im Anhang

Habe schon gehofft das ich auf dein Feedback zählen kann. Danke!

Die sourcen befinden sich im Anhang...
Michael Wittwer ist offline   Mit Zitat antworten
Alt 07-02-2012, 07:33   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Ich glaube die Anwendung der getter/setter funktionen ist falsch. Scope der Funktionen und Eigenschaften, die im Closure ausgeführt werden, referenzieren nicht die Objekte, die du in der Funktion angibst.

Ich baue heute Nachmittag/Abend ein Beispiel.
Omega Psi ist offline   Mit Zitat antworten
Alt 07-02-2012, 07:42   #5 (permalink)
Neuer User
 
Registriert seit: May 2004
Beiträge: 13
Getter / Setter sind in Ordnung

Ich bin mir ziemlich sicher, dass die getter / setter Methoden so funktionieren, ich habe das ganze auch schon "gedebuggt" und die rückgabewerte sind korrekt.
Das Problem ist wohl das in der chain des bindings das erste property P_EDITED_VALUES bei jedem binding gleich ist, und somit die handler immer aufgerufen werden ohne die weiteren properties der chain zu beachten.
Wie ich das aber lösen kann, weiss ich nicht?!
Michael Wittwer ist offline   Mit Zitat antworten
Alt 07-02-2012, 07:44   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Ich schaue mir das nachher noch mal an.
Omega Psi ist offline   Mit Zitat antworten
Alt 08-02-2012, 09:17   #7 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Sorry, gestern war zu viel los. Ich hab das Problem aber nicht vergessen.
Omega Psi ist offline   Mit Zitat antworten
Alt 08-02-2012, 09:39   #8 (permalink)
Neuer User
 
Registriert seit: May 2004
Beiträge: 13
Danke für das Feedback

Danke für die kurze Rückmeldung. Bin selber auch noch nicht weiter gekommen...
Michael Wittwer ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
ArrayCollection Items übergeben und Werte ändern bei Aallen Items? Silver_Surfer Flex programmieren 6 10-11-2010 15:05
Deep Exploration Flash_Lerhling 3D 1 07-06-2004 16:26
deep link von html in flash dahoo HTML und CSS 1 22-09-2003 14:02


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele