2012-04-13 4 views
0

Dies ist eine Art von einem zweiteiligen Problem.KnockoutJS und Zuordnung Plugin-spezifische Logik auf Datenaktualisierung mit Vorlage Nachrender

Zuerst verwende ich einen Nachrender auf meiner Vorlagenbindung, um eine Aktion jedes Mal durchzuführen, wenn die Vorlage neue Daten rendert. Das funktioniert richtig ... außer es funktioniert auch richtig. Es wird nur ausgelöst, wenn Daten hinzugefügt oder entfernt werden.

Zweitens, um das erste "Problem" zu bekämpfen, dachte ich, ich musste ein benutzerdefiniertes "Update" schreiben und erkennen, ob sich die Daten geändert haben. Was wiederum Sinn macht, allerdings merkte ich, dass die Update-Funktion im Mapping auch folgt, dass die Idee "nur ausgeführt, wenn Daten hinzugefügt oder entfernt werden".

Also dachte ich, ich brauchte ein Update um eine spezifische Eigenschaft des Mapping-Modell wie zu machen:

var dataMappingOptions = { 
    key: function(data) { 
     return data.id;   
    }, 
    create: function(options) { 
     return new Person(options.data); 
    }, 
    update: function(options) { 
     // if first changed, doSomething(); 
     return options.target; 
    }, 
    'first': { 
     update: function(options) { 
      // if first changed, doSomething(); 
      return options.target.first; 
     } 
    } 
}; 

Aber das nur verwandelt sich in eine ganze Chaos, und die Arbeit noch nicht einmal.

Hier ist die FIDDLE, wenn Sie es auschecken möchten.

Lange Rede, kurzer Sinn, ich bin sicher, dass es eine Möglichkeit geben muss, eine Immobilie zu abonnieren, während sie aktualisiert wird? Ich schätze, du musst nur berechnete Observables erstellen? Ich werde es rauswerfen und sehen, ob Ryan mich lehren will, wie er schon so oft hat :)

Antwort

2

Sie können vielleicht erklären, ob es etwas anderes gibt, das Sie versuchen zu erreichen, aber hier ist wie Ich würde es nähern:

Ich würde eine manuelle Anmeldung zu firstName verwenden und meine Aktion dort ausführen. Ich würde dieses Abonnement in Ihrem Person Konstruktor einrichten.

Etwas wie:

var Person = function(data) { 
    this.id = data.id; 
    this.first = ko.observable(data.first); 
    this.last = ko.observable(data.last); 
    this.full = ko.computed(function() { 
     return this.first() + " " + this.last(); 
    }, this);  
    this.first.subscribe(function(newValue) { 
     alert(this.full() + " had his/her first name changed"); 
    }, this);   
}; 

wie dieses Beispiel sein würde: http://jsfiddle.net/rniemeyer/EDC7q/

dies ausreichen würde? Welche Art von Aktion möchten Sie durchführen, wenn sich der Wert ändert?

+0

Ich führe eine UI-Aktion durch, die nur bei Datenänderungen ausgeführt werden muss. Leider gibt es bei der Datenaktualisierung keine Antwort, nur hinzufügen und entfernen. Was ist der Unterschied zwischen abonnieren und berechnet? – farina

+0

Eine Subskription ist spezifisch für eine einzelne Observable und erzeugt keine zusätzlichen Abhängigkeiten, wenn sie evaluiert wird. –

+0

Ok, das ist großartig. Danke für die Information! – farina