2011-10-18 25 views
91

Tengo una serie de botones que, al hacer clic, muestran un menú emergente ubicado justo debajo del botón. Quiero pasar la posición del botón a la vista. ¿Cómo puedo hacer eso?Cómo pasar parámetros a una vista

ItemView = Backbone.View.extend({ 
    tagName: 'li', 
    events: { 
     'click': 'showMenu' 
    }, 
    initialize: function() { 
     _.bindAll(this, 'render'); 
    }, 
    render: function() { 
    return $(this.el).html(this.model.get('name')); 
    }, 
    showMenu: function() { 
     var itemColl = new ItemColl(); 
     new MenuView({collection: itemColl}); // how to pass the position of menu here? 
    } 
}); 

Respuesta

164

Usted solo necesitas pasar el parámetro adicional cuando construyes el Menú Ver. No es necesario agregar la función initialize.

new MenuView({ 
    collection: itemColl, 
    position: this.getPosition() 
}) 

Y entonces, en MenuView, puede utilizar this.options.position.

ACTUALIZACIÓN: Como@mu is too short states, desde 1.1.0, Backbone Views no longer automatically attach options passed to the constructor as this.options, but you can do it yourself if you prefer.

Así que en su método initialize, puede guardar el options pasado como this.options:

initialize: function(options) { 
    this.options = options; 
    _.bindAll(this, 'render'); 
}, 

o utilizar algunas formas más sutiles como described by @Brave Dave .

+53

Esto ya no funciona como de 1.1.0: [ "columna vertebral Vistas conceden automáticamente ya no opciones pasadas al constructor como' this.options', pero puede hacerlo usted mismo si lo prefiere."] (Http: // backbone.js. org/# changelog). –

+7

Para obtener el mismo comportamiento ahora: http://stackoverflow.com/a/19325531/941764 – jgillich

+1

Esto funciona perfectamente, sólo tiene que añadir el parámetro en el método initialize vista: inicializar: function (opciones) { alerta (options.position) ; } –

46

Añadir un argumento opciones para initialize:

initialize: function(options) { 
    // Deal with default options and then look at options.pos 
    // ... 
}, 

y luego pasar en algunas opciones al crear la vista:

var v = new ItemView({ pos: whatever_it_is}); 

Para más información: http://backbonejs.org/#View-constructor

+0

enlace muy útil! –

+0

esto es más elegante/simple para la mayoría de las situaciones. –

+0

@CullenSUN: Gracias. Prefiero lo explícito de este enfoque, la "acción a distancia" mágica de usar 'this.options' me da pesadillas de mantenimiento y depuración. –

-1

pase desde otro lugar

new MenuView({ 
    collection: itemColl, 
    position: this.getPosition() 
}) 

Añadir un argumento opciones para inicializar en vista de que está recibiendo esa variable pasada,

initialize: function(options) { 
    // Deal with default options and then look at options.pos 
    // ... 
}, 

para obtener el valor de uso -

var v = new ItemView({ pos: this.options.positions}); 
+5

escribe respuestas mejoradas no colectivas. –

+0

¡Esta es una respuesta mejorada! –

11

A partir del backbone 1.1.0, el argumento options es no longer attached automáticamente a la vista (vea issue 2458 para la discusión). Ahora tiene que unir las opciones de cada vista de forma manual:

MenuView = Backbone.View.extend({ 
    initialize: function(options) { 
     _.extend(this, _.pick(options, "position", ...)); 
    } 
}); 

new MenuView({ 
    collection: itemColl, 
    position: this.getPosition(), 
    ... 
}); 

Alternativamente, puede utilizar this mini plugin para auto-conectar opciones de la lista blanca, así:

MenuView = Backbone.View.extend({ 
    options : ["position", ...] // options.position will be copied to this.position 
}); 
-2

Uso this.options a recuperar argumentr en vista

// Place holder 
<div class="contentName"></div> 

var showNameView = Backbone.View.extend({ 
     el:'.contentName', 
     initialize: function(){ 
      // Get name value by this.options.name 
      this.render(this.options.name); 
     }, 
     render: function(name){ 
      $('.contentName').html(name); 
     } 
    }); 

    $(document).ready(function(){ 
     // Passing name as argument to view 
     var myName1 = new showNameView({name: 'Nishant'}); 
    }); 

Ejemplo de trabajo: http://jsfiddle.net/Cpn3g/1771/

Cuestiones relacionadas