2013-07-07 3 views
19

ich ein Modell haben, die durch eine bestimmte Ansicht bearbeitet werden können; Am Ende der Ansicht sollte der Benutzer jedoch eine Option zum Speichern oder Verwerfen aller Änderungen erhalten. Das bedeutet, dass Sie eine Liste aller am Modell vorzunehmenden Änderungen speichern müssen und diese Änderungen erst dann vornehmen müssen, wenn Sie auf die Schaltfläche "Speichern" geklickt haben. Das klingt unnötig kompliziert und ich habe mir eine alternative Vorgehensweise ausgedacht, die darin besteht, einen Klon des Modells zu erstellen und Änderungen in der Ansicht vorzunehmen. Wenn der Benutzer dann auf "Speichern" klickt, löschen Sie das alte Modell und ersetzen Sie es in seiner Sammlung durch das neue, andernfalls verwerfen Sie das geklonte Modell.Wie zu klonen Modelle in Backbone

Dieser dies ein akzeptabler Ansatz, und wenn ja, wie kann ich das Klonen Prozess implementieren?

wäre Dies äquivalent die Daten von dem Server wieder (aber eine zusätzliche HTTP-Anforderung scheint unnötig) zu holen.

+1

Aber warum müssten Sie das Modell überhaupt klonen? Wie auch immer Sie können alle Werte auf Speichern klicken und speichern Sie sie; oder wenn Sie wissen möchten, ob einer der Werte beim Speichern geändert wurde, implementieren Sie einfach Model View Binding. – Pawan

Antwort

25

Sie könnten die clone Methode verwenden. Kurz Beispiel unten:

var Model = Backbone.Model.extend({}); 
var View = Backbone.View.extend({ 
    initialize: function() { 
     this.realModel = this.model; 
     this.model = this.realModel.clone(); 
    }, 
    onSave: function() { 
     this.realModel.set(this.model.attributes); 
    } 
}); 

könnten Sie auch tun etwas ein bisschen anders:

var Model = Backbone.Model.extend({}); 
var View = Backbone.View.extend({ 
    initialize: function() { 
     // save the attributes up front, removing references 
     this._modelAttributes = _.extend({}, this.model.attributes); 
    }, 
    onSave: function() { 
     // revert to initial state. 
     this.model.set(this._modelAttributes); 
    } 
}); 
+0

is 'this.realModel.set (this.model.attributes);' Definitiv sicher? Ich denke nur, 'this' Werte könnten anders sein (obwohl ich denke,' this' bezieht sich auf 'Backbone.Model' in beiden, ich bin mir nicht sicher) –

+0

Auch Entschuldigung für meine Ignoranz, aber was ist der Sinn der Zeile 'var Model = Backbone.Model.extend ({});' - Ich sehe nicht, dass Sie 'Model' verwenden. Oder haben Sie nur ein Beispiel gemacht und vorgeschlagen, dass Sie Model als Modell für View übergeben, wenn Sie eine Instanz davon erstellen? –

+0

Ich plante, die Ansicht mit einem Modell zu initialisieren, aber ich tat es nicht. Sie können wahrscheinlich das 'var Model' ignorieren. Das 'this' ist' this.realModel.set (this.model.attributes) 'bezieht sich immer auf die Ansicht, da dies der aktuelle Kontext ist. – kalley

0

Sie können Backbone.Memento geben einen Versuch.

Wenn Sie nicht, es zu benutzen kein Problem wollen. Aber, Sie können eine gute Idee bekommen, wie es von der Codebasis getan werden sollte.

+0

Gibt es einen Grund, diese über Kalleys Methode oben zu verwenden, oder stellen Sie nur eine Alternative zur Verfügung? –

+0

Nein, es ist eine Alternative. Es ist sehr klein und bietet viele andere Funktionen. Deshalb schlage ich vor. – Rifat

0

ich in der Regel dieses Problem mit einer Objekt-Cache für die Sicht lösen. Auf diese Weise kann ich der Modell-/Ansichtsverwaltung keinen unnötigen Aufwand hinzufügen. Das Verwerfen geschieht natürlich, wenn der Benutzer eine Ansicht schließt, ohne zu speichern.

var Model = Backbone.Model.extend({ 
    'title': 'Hello' 
}); 

var View = Backbone.View.extend({ 
    initialize: function() { 

     // Holds temporary values until save 
     this.cache = {}; 

    }, 
    onTitle: function() { 
     this.cache.title = 'World'; 
    }, 
    onSave: function() { 
     this.model.set(this.cache); 
    } 
}); 
Verwandte Themen