2012-04-27 11 views
9

Acabo de actualizar un sitio en el que trabajé desde Backbone.js 0.5.3 a Backbone.js 0.9.2 Cuando lo hice obtengo un parámetro de opciones indefinido que uso en mi método de inicialización de modelos. ¿Qué ha cambiado desde V.5 a V.9Backbone initialize: la función (opciones) no funciona en V9

initialize: function (opciones) {} enter code here

bien aquí está mi estructura del modelo. Todo funciona bien en 0.5.3 pero cuando uso 0.9.2 las opciones ya no funcionan.

this.myModel = Backbone.Model.extend({ 

     defaults: function() { 
      return { 
       maxDays: 7, 
       index: 0 

      }; 
     }, 

     initialize: function(options) { 

     } 

}) 



this.model = new myModel(); 

En la versión 0.5.3 las opciones mostrarán todos los atributos que se establecieron en el objeto predeterminado. pero en la versión 0.9.2 esto ya no funciona devuelve indefinido. No puedo publicar un enlace debido a la sensibilidad del cliente.

Respuesta

15

La firma de inicialización no ha cambiado, creo que de 0.5 a 0.9. Sin embargo, solo obtiene opciones aprobadas si las pasa al constructor. Consulte el annotated source for Backbone.Model. Cada vez que se instancia una nueva instancia de modelo, el constructor hace esto:

this.initialize.apply(this, arguments); 

Así que cualquier cosa que pase al constructor se pasa sin modificar para inicializar. Por lo tanto, busque en su código los casos en los que crea una nueva instancia de modelo pero no pasa 2 argumentos (atributos y opciones).

Sobre la base de su código de ejemplo, ahora tiene que definir initialize como tomar 2 parámetros: attributes y options y al crear sus modelos, si desea simplemente pasar opciones hacer:

var model = new Model(null, options); 

o

var model = new Model({}, options); 

Creo que el cambio específico que rompió su código es el cambio de llamar inicializar con argumentos explícitos en 0.5.3 a usar aplicar y argumentos en 0.9.3 como este:

this.initialize.apply(this, arguments); 

Así que en 0.9 se puede obtener acceso a sus valores por defecto a través this.attributes, pero no va a entrar como un parámetro de función a menos que entraron como parámetro a la función constructora.

var MyModel = Backbone.Model.extend({ 
    defaults: {x: 42, y: 43}, 
    initialize: function(attributes, options) { 
     console.log(arguments, attributes, this.attributes);} 
}); 
var m = new MyModel(); 

que registrará [], undefined, Object desde argumentos está vacía, los atributos no está definido, ya que nada se pasa al constructor, pero los valores por defecto se han puesto en this.attributes y están ahí para su uso.

+0

He añadido más código arriba. Entonces, initialize debería tener 2 parámetros. Las opciones han sido las segundas. Pero si usted dice que eso no ha cambiado desde V5, eso no explica por qué funciona con un solo parámetro en V5 y no en V9 – user1096509

+0

. Comprobé el código fuente 0.5.3: https://github.com/documentcloud/ backbone/blob/29b60e53fa18b6fffb4a21d0d1c8c9fdbde43b6c/backbone.js # L132 y el código fuente 0.9.2: https://github.com/documentcloud/backbone/blob/863814e519e630806096aa3ddeef520afbb263ff/backbone.js#L189 y ambos toman atributos y luego opciones. En cuanto a su código ahora ... –

+0

Ok, gracias, así que agregué un segundo parámetro a mi código y todavía devuelve indefinido para ambos parámetros en V9. inicializar: función (atributos, opciones) {¿ES esto a lo que se refiere? Luego, en V5, solo el primer parámetro funciona en mi configuración. – user1096509

Cuestiones relacionadas