2013-08-23 11 views
5

Ich habe eine Anforderung, einen Benutzer über nicht gespeicherte Änderungen zu "nageln", wenn sie zwischen verschiedenen Backbone-Sammlungsmodellen wechseln (durch Klicken auf eine Tabellenzeile). Ich habe gegoogelt für "Rückgratmodell schmutzige Daten überprüfen" (zum Beispiel) und nichts definitives gefunden.Überprüfung auf alle schmutzigen Backbone-Modelldaten innerhalb der Sammlung

ich erreichte dies mit underscore's "some" und isEqual functionality, in einer Weise, wie die folgenden, „some()“ ausreichend ist, um zu bestimmen, ob es irgendwelche nicht gespeicherte Änderungen sind (im Gegensatz zu dem, was diese genauen Änderungen sein könnten) , insbesondere weil das Modellattribut tatsächlich ein Array von Objekten ist.

var anyDirty = _.some(myCollection.models, function(model) { 
    return !_.isEqual(model.get('nodes'), model.previousAttributes()['nodes]); 
}); 

Ich bin neu in Backbone und frage mich, ob dies eine akzeptierte Art von Ansatz für Ad-hoc-ist-Daten für schmutziges Modell zu überprüfen. Oder stellt Backbone eine Art eingebauter Funktionalität für diesen Zweck bereit, die meine ersten Googling-Versuche nicht enthüllten?

+1

Was ist mit http://stackoverflow.com/questions/9215036/backbone-js-is-there-a-change-since-last-server-save? – nikoshr

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Jetzt merke ich, dass ich meine Frage nicht spezifisch genug geschrieben habe. Ich denke, ich möchte wissen, ob sich * irgendein * Modell in einer bestimmten Sammlung geändert hat. In diesem Fall scheint meine Verwendung von _.some immer noch zu gehören, aber innerhalb des Iterators kann ich 'model.hasChanged()' anstelle von _.isEqual() verwenden –

+1

Sie können stattdessen zuhören, wenn 'change' Ereignisse ausgelöst werden . Behalte es als einen Zustand in deiner Sammlung. Löschen Sie es, sobald die Sammlung wieder mit dem Server synchronisiert wurde. Überprüfen Sie dann nur dieses Statusattribut. Ich denke, 'change' wird auch ausgelöst, wenn Sie ein neues Modell erstellen, also sollten Sie auch nach' isNew() 'suchen. – j03w

Antwort

2

Ich habe ein anderes Attribut muss ich zusätzlich zu ‚Knoten‘ überwachen, so dass ich die Umstellung auf mit changedAttributes(): http://backbonejs.org/#Model-changedAttributes:

var anyDirty = _.some(myCollection.models, function(model) { 
    return model.changedAttributes(); 
}); 

Was dies eine unvollkommene Lösung machen kann, ist, dass es scheint so wie es ein Objekt von changedAttributes zurückgibt, selbst wenn das Attribut wieder auf seinen ursprünglichen Wert zurückgesetzt wurde. Es scheint also fast so, als würde ich auf lange Sicht einen Schnappschuss der Originaldaten machen und vergleichen. Dennoch ist die Verwendung von model.changedAttributes() eine prägnantere Alternative zu dem, was ich zuerst gepostet habe.

+3

Sie werden entdecken, dass die averageattributes enthält jene seit dem letzten 'set' nicht zuletzt 'sync' –

Verwandte Themen