2013-07-07 11 views
19

Ho un modello che può essere modificato da una determinata vista; tuttavia, nella parte inferiore della vista, l'utente dovrebbe avere un'opzione per salvare o eliminare tutte le modifiche. Ciò significa che è necessario memorizzare un elenco di tutte le modifiche da apportare al modello e apportare tali modifiche solo dopo aver fatto clic sul pulsante "Salva". Questo sembra inutilmente complicato e mi è venuta in mente un'idea di un approccio alternativo che consiste nel creare un clone del modello e apportare modifiche a tale aspetto. Quindi se l'utente fa clic su "salva" elimina il vecchio modello e lo sostituisce nella sua raccolta con quello nuovo, altrimenti scarti il ​​modello clonato.Come clonare i modelli in Backbone

Questo è un approccio accettabile e, in caso affermativo, come posso implementare il processo di clonazione?

Ciò equivarrebbe a recuperare nuovamente i dati dal server (ma una richiesta HTTP aggiuntiva non è necessaria).

+1

Ma perché sarebbe necessario clonare il modello? Ad ogni modo è possibile estrarre tutti i valori su Salva e salvarli; oppure se vuoi sapere se uno qualsiasi dei valori è stato modificato durante il salvataggio, implementa semplicemente "Model View Binding". – Pawan

risposta

25

È possibile utilizzare il metodo clone. Breve esempio qui sotto:

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

Si potrebbe anche fare qualcosa di un po 'diverso:

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

è 'this.realModel.set (this.model.attributes);' sicuramente sicuro? Sto solo pensando che "questo" valore potrebbe essere diverso (anche se penso che "questo" si riferisca a "Backbone.Model" in entrambi, non sono sicuro) –

+0

Inoltre, scusa per la mia ignoranza, ma qual è il punto linea 'var Modello = Backbone.Model.extend ({});' - Non ti vedo usare 'Model' ovunque. O stavi facendo un esempio e suggerivi di passare 'Modello' come modello per la visualizzazione quando ne crei un'istanza? –

+0

Stavo pianificando di inizializzare la vista con un modello, ma non l'ho fatto. Probabilmente puoi ignorare il 'var Model'. Il 'this' è' this.realModel.set (this.model.attributes) 'si riferisce alla vista sempre poiché questo è il contesto corrente. – kalley

0

Si può dare Backbone.Memento una prova.

Se non si desidera utilizzarlo, nessun problema. Ma puoi avere una buona idea di come dovrebbe essere fatto dalla base di codice.

+0

c'è un motivo per usare sopra questo metodo sopra kalley, o stai solo fornendo un'alternativa? –

+0

No, è un'alternativa. È molto piccolo e fornisce molte altre funzionalità. Ecco perché suggerisco. – Rifat

0

Solitamente risolvo questo problema con una cache di oggetti sulla vista. In questo modo non aggiungo alcun overhead non necessario per modellare/visualizzare la gestione. L'eliminazione avviene naturalmente se l'utente chiude una vista senza salvare.

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