2015-07-10 7 views
6

Ecco uno example che utilizza Backbone con React.Confusione sui modelli in Backbone + Applicazione React

Egli definisce un Model: var _todos = new Backbone.Model();

E poi aggiunge due funzioni ad esso:

var TodoStore = _.extend(_todos, { 
    areAllComplete: function() { 
    return _.every(_todos.keys(), function(id){ 
     return _todos.get(id).complete; 
    }); 
    }, 
    getAll: function() { 
    return _todos.toJSON(); 
    } 
}); 

Quello che non capisco è perché areAllComplete viene applicato ad un Model invece che a un Collection.

Questa non dovrebbe essere una funzione in un Collection che otterrà tutti i suoi modelli e verificare che l'attributo complete.

Analogamente, mi aspetto che getAll appartenga a un Collection - ottieni tutti i suoi modelli.

Questo esempio sembra sostituire Collection con Model.

Forse non capisco completamente come vengono utilizzati i modelli.

+1

Non capisco perché dovresti mixare Backbone e Flux. – Mathletics

+1

Ri: modello v collezione, dipende da come li si archivia sul server. Appare qui che il modello è in effetti un _list_ di tutti i tipi, che ogni elemento viene semplicemente inserito come attributo su quel modello. L'intera cosa mi sembra abbastanza stupida. – Mathletics

+0

@Mathletics c'è una ragione per cui non dovrei usare i due insieme? Reagire è solo la "V in MVC", giusto? Voglio usare Backbone per routing e negozi. Ho considerato questo [approccio] (http://www.toptal.com/front-end/simple-data-flow-in-react-applications-using-flux-and-backbone). – pushkin

risposta

2

Questo esempio utilizza Backbone.Model in un modo abbastanza strano a mio parere.

This è dove è l'aggiunta di nuove todos al negozio:

var id = Date.now(); 
    _todos.set(id, { 
    id: id, 
    complete: false, 
    text: text 
    }); 
} 

Che è fondamentalmente facendo è impostare ogni todo-elemento come un attributo del Model, utilizzando l'ID come il nome dell'attributo. Si finisce con _todos.attributes cercando qualcosa di simile sotto

{ 
    "1436600629317": { 
    "id": 1436600629317, 
    "complete": false, 
    "text": "foo" 
    }, 
    "1436600629706": { 
    "id": 1436600629706, 
    "complete": false, 
    "text": "bar" 
    } 
} 

questa è la stessa uscita si ottiene da _todos.toJSON(). Non ho idea del motivo per cui hanno deciso di implementarlo in quel modo, se dovessero provare a utilizzare Backbone.Sync, finirebbero con un'API del server che non è esattamente RESTful. Sembra strano usare Backbone senza sfruttare nessuno degli elementi forniti da Backbone. C'è un riferimento all'evento changehere ma non vedo che venga utilizzato da nessuna parte. Potresti facilmente reimplementare quel negozio usando qualsiasi oggetto JS regolare.

L'unica cosa che sembra essere effettivamente utilizzata da Backbone è Backbone.Events nel dispatcher. Hai perfettamente ragione nel ritenere che l'utilizzo di una raccolta sia più sensato, perché in tal caso potresti effettivamente farlo parlare con un'API del server basata su REST. Questo esempio sembra utilizzare solo Backbone per l'utilizzo di Backbone.