2011-08-17 13 views
10

Ho un'applicazione che consiste in una raccolta Backbone.js e una connessione in tempo reale al server.Aggiornamento di una raccolta Backbone.js senza cancellare i vecchi modelli

Ogni volta che un client aggiunge/rimuove/aggiorna un modello nella raccolta, la raccolta aggiornata viene trasmessa a tutti gli altri client (non al delta, l'intera raccolta).

Quando si gestisce questo evento di aggiornamento dagli altri client, l'unico modo che ho trovato di aggiornare la raccolta è un reset(). Sfortunatamente, questo pulisce i vecchi modelli e ne crea di nuovi, insieme a tutti gli effetti collaterali correlati alla vista.

Esiste un modo approvato da Backbone di aggiornare una raccolta che mantiene e aggiorna i modelli originali (confrontando per ID), creando/eliminandoli solo se necessario?

UPDATE Backbone ha aggiunto il metodo Collection.set, che è in grado di aggiornare i modelli esistenti.

+0

correlati: https://github.com/documentcloud/backbone/issues/955 – philfreo

risposta

8

La soluzione sono andato con è:

Backbone.Collection.prototype.update = function(colIn){ 

    var ids = []; 

    _(colIn).each(function(modIn){ 
    var existing = this.get(modIn); 
    // update existing models 
    if (existing) { existing.set(modIn); } 
    // add the new ones 
    else { this.add(modIn); } 

    ids.push(modIn.id); 
    }, this); 

    // remove missing models (optional) 
    var toRemove = this.reject(function(model){ 
    return _(ids).include(model.id); 
    }); 

    this.remove(toRemove); 
    return this; 
}; 
+2

Grande. Solo una cosa ... aggiungi "ritorna questo" alla fine. I metodi backbone restituiscono sempre il loro oggetto di contesto in modo da poterli concatenare ('my_col.update (x) .toJSON()'). – Jake

+0

Fatto. Grazie, Jake. –

0

quando si aggiunge un modello alla raccolta, viene richiamato il richiamo "aggiungi". Usalo invece di resettare.

+1

Se solo lo stato delta è stato trasmesso al cambiamento (ad esempio "modello A è stato aggiunto/rimosso/aggiornato"), questa sarebbe la soluzione corretta. Tuttavia, l'intera raccolta viene ritrasmessa anziché una alla volta, quindi la domanda è: come conservare le istanze originali dei modelli esistenti. –

0

È possibile estendere il metodo di raccolta add e controllare lì per il modello esistenza

Problemi correlati