2012-07-02 18 views
5

Necesito pasar un valor de la vista a cada uno de los modelos dentro de una colección, durante la inicialización.Backbone.js: pasar el valor de la colección a cada modelo

Hasta la Colección podemos pasar con 'opciones' en el constructor Backbone.Collection.

Después de esto, ¿hay alguna técnica donde pueda pasar algunas 'opciones' en cada modelo dentro de la colección?

var Song = Backbone.Model.extend({ 
    defaults: { 
     name: "Not specified", 
     artist: "Not specified" 
    }, 
    initialize: function (attributes, options) { 
     //Need the some_imp_value accessible here 
    }, 
}); 

var Album = Backbone.Collection.extend({ 
    model: Song 

    initialize: function (models, options) { 
     this.some_imp_value = option.some_imp_value; 
    } 
}); 

Respuesta

6

Puede anular el método "_prepareModel".

var Album = Backbone.Collection.extend({ 
    model: Song 

    initialize: function (models, options) { 
     this.some_imp_value = option.some_imp_value; 
    }, 

    _prepareModel: function (model, options) { 
     if (!(model instanceof Song)) { 
      model.some_imp_value = this.some_imp_value; 
     } 
     return Backbone.Collection.prototype._prepareModel.call(this, model, options); 
    } 
}); 

Ahora se puede ver en los atributos pasados ​​con el modelo de 'inicializar' y obtendrá some_imp_value, que luego se puede fijar en el modelo según corresponda ..

0

A pesar de que parece ser sin documentar, he encontrado que al menos en la última versión de la red troncal (v1.3.3), el objeto de opciones que se pasa a una colección pasa a cada modelo hijo, extendido a los otros elementos de opciones generados por la colección. No he pasado el tiempo para confirmar si este es el caso con versiones anteriores.

Ejemplo:

var Song = Backbone.Model.extend({ 
    defaults: { 
     name: "Not specified", 
     artist: "Not specified" 
    }, 
    initialize: function (attributes, options) { 
     //passed through options 
     this.some_imp_value = options.some_imp_value 

     //accessing parent collection assigned attributes 
     this.some_other_value = this.collection.some_other_value 
    }, 
}); 

var Album = Backbone.Collection.extend({ 
    model: Song 

    initialize: function (models, options) { 
     this.some_other_value = "some other value!"; 
    } 
}); 

var myAlbum = new Album([array,of,models],{some_imp_value:"THIS IS THE VALUE"}); 

Nota: No estoy seguro de si las opciones de objeto se pasa a eventos posteriores Collection.add

Cuestiones relacionadas