2012-10-27 5 views
0

J'ai une collection de modèles de Backbone comme ceci:Backbone Collections - est-ce que create() est une méthode d'instance?

window.Message = Backbone.Model.extend({}); 

window.MessageCollect = Backbone.Collection.extend({ model: Message, url: '/messages'}); 

Pourquoi dois-je instancier une nouvelle collection pour appeler create()? Si j'appelle create() sur MessageCollect, j'obtiens une erreur no method.

window.Messages = new MessageCollect; 

function makeMessage(){ Messages.create({title:'first message', sender:user_name}); } 
//ok 

function makeMessageTwo(){ MessageCollect.create({title:'first message', sender:user_name}); } 
//Object function(){ parent.apply(this, arguments); } has no method 'create' 

Répondre

2

Parce que Backbone.Collection - est une classe, pas une instance. Lorsque vous appelez Backbone.Collection.extend vous étendez la classe de base, vous ne créez pas de nouvelle instance. Collection.create() - méthode pour créer un nouveau modèle dans la collection INSTANCE. Quand vous n'avez pas d'instance, comment pouvez-vous ajouter de nouveaux modèles?

2

Pour mieux comprendre ce qui se passe ici, here is what _.extend does:

Copie toutes les propriétés de la source objets sur l'objet de destination , et retourner l'objet de destination. Il est dans l'ordre, alors la dernière source remplacera les propriétés du même nom dans les arguments précédents .

si Backbone.Collection.extend est juste de prendre l'objet source que vous avez défini et en ajoutant ses propriétés à Backbone.Collection afin qu'il augmente avec ce que vous avez défini, puis l'assigner à votre window.MessageCollect variable.

En regardant backbone code, ce qu'il fait est qu'il « étend » le prototype de la collection avec ces méthodes Créer, Ajouter, toJson etc ... car il a ajouté au prototype alors il applique à cas du Backbone.Collection pas la fonction elle-même, car what prototype does

Les objets fonction héritent de Function.prototype. Les modifications de l'objet Function.prototype sont propagées à toutes les instances Function.

D'une certaine manière, il est équivalent à ce code simple:

var Car = function(name){ 
    this.name = name; 
} 

var ford = new Car("ford"); 

Car.prototype.drive = function(){ 
    console.log("drive"); 
} 

ford.drive(); //possible 
Car.drive(); // not possible: Uncaught TypeError: object has no method 'drive' 
​ 

Questions connexes