2015-07-10 6 views
6

Hier ist eine example, die Backbone mit React verwendet.Verwirrung über Modelle in Backbone + React-Anwendung

Er definiert eine Model: var _todos = new Backbone.Model();

Und fügt dann zwei Funktionen hinzu:

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

Was ich nicht verstehe ist, warum areAllComplete auf eine Model angewendet wird statt zu einem Collection.

Sollte dies nicht eine Funktion in einer Collection sein, die alle seine Modelle erhalten und überprüfen Sie, dass complete Attribut.

Ebenso würde ich erwarten, dass getAll zu einem Collection gehören - alle seine Modelle zu bekommen. Dieses Beispiel scheint Collection durch Model zu ersetzen.

Vielleicht verstehe ich nicht ganz, wie Modelle verwendet werden.

+1

Ich verstehe nicht, warum Sie Backbone und Flux mischen würden. – Mathletics

+1

Re: Modell v Sammlung, es hängt davon ab, wie Sie sie auf dem Server speichern. Es erscheint hier, dass das Modell tatsächlich eine _Liste_ von Todos ist, wobei jedes Element gerade als Attribut für dieses Modell eingegeben wird. Das Ganze scheint mir ziemlich albern zu sein. – Mathletics

+0

@Mathletics gibt es einen Grund, warum ich die beiden nicht zusammen verwenden sollte? Reagieren ist nur das "V in MVC", oder? Ich möchte Backbone für Routing und Stores verwenden. Ich habe darüber nachgedacht [http://www.toptal.com/front-end/simple-data-flow-in-react-applications-using-flux-and-backbone]. – pushkin

Antwort

2

Dieses Beispiel verwendet Backbone.Model meiner Meinung nach auf eine ziemlich seltsame Weise.

This ist, wo es neue todos zum Speicher hinzufügen:

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

Was es im Grunde tut wird jedes todo-Element als Attribut der Model Einstellung, die ID als Name-Attribut. Es endet mit _todos.attributes etwas wie die Suche unter

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

Das ist die gleiche Ausgabe, die Sie von _todos.toJSON() erhalten. Ich habe keine Ahnung, warum sie sich entschieden haben, es so zu implementieren. Wenn sie Backbone.Sync verwenden wollten, würden sie mit einer Server-API enden, die nicht genau REST-konform ist. Es ist seltsam, Backbone zu verwenden, ohne die Backbone-Funktionen zu nutzen. Es gibt einen Hinweis auf das change Ereignis here, aber ich sehe es nirgendwo verwendet. Sie könnten diesen Speicher einfach mit jedem regulären JS-Objekt neu implementieren.

Das einzige, was dieses Beispiel scheint von Backbone tatsächlich zu verwenden ist Backbone.Events im Dispatcher. Sie haben vollkommen recht, dass die Verwendung einer Collection viel sinnvoller ist, weil Sie dann tatsächlich mit einer REST-basierten Server-API kommunizieren können. Dieses Beispiel scheint nur Backbone zu verwenden, um Backbone zu verwenden.