2011-12-11 8 views
30

Escenario:
tengo una alert() diciendo undefined cuando (intentar) establecer la variable de myVar a través del constructor. Sin embargo, si elimino el comentario del myVar que está dentro de myView, la alerta dice "Hola desde dentro", tal como cabría esperar.Backbone.js - el paso de argumentos a través de constructores

Pregunta:
¿Quiere esto decir que no puedo fijar cualquier params en el constructor de la vista, excepto columnas vertebrales propios parametros, como model, collection, el, id, className & tagName?
Manual: http://documentcloud.github.com/backbone/#View-constructor

El código:

var myView = Backbone.View.extend({ 

    //myVar : 'Hello from inside', 

    initialize: function() { 
     alert(this.myVar); 
    } 
)}; 

new myView({myVar: 'Hello from outside'}); 

Respuesta

56

opciones pasadas al constructor se almacenan automáticamente como this.options

var myView = Backbone.View.extend({ 

    myVar : 'Hello from inside', 

    initialize: function() { 
     alert(this.options.myVar); 
    } 
)}; 

new myView({myVar: 'Hello from outside'}); 
+0

fantástico. ¡Había olvidado completamente eso en el manual! – Industrial

+11

Debe tenerse en cuenta que en esta situación su vista recién creada tendrá 'this.myVar' y' this.options.myVar'. Si está intentando sobrescribir 'this.myVar' con las opciones aprobadas, es posible que desee' this.myVar = this.options.myVar' en su función de inicialización. – czarchaic

+3

¡Impresionante! Búsqueda rápida de Google. –

24

Como columna vertebral de 1.1.0, el argumento options es no longer attached automáticamente a la vista (ver issue 2458 para discusión). Ahora tiene que unir las opciones de cada vista de forma manual:

MyView = Backbone.View.extend({ 
    initialize: function(options) { 
     _.extend(this, _.pick(options, "myVar", ...)); 
     // options.myVar is now at this.myVar 
    } 
}); 

new MyView({ 
    myVar: "Hello from outside" 
    ... 
}); 

Alternativamente, puede utilizar this mini plugin a Conectar automáticamente las opciones de la lista blanca, así:

MyView = BaseView.extend({ 
    options : ["myVar", ...] // options.myVar will be copied to this.myVar on initialize 
}); 
Cuestiones relacionadas