2011-10-25 7 views
22

Tengo postes modelo de publicación y colección. Y quiere hacer la forma con la lista de todas las publicaciones en <select id="multi" multiple="multiple">. Así que tengo que hacer una POSTVIEW render dentro de mi #multi con sólo esta plantilla:Backbone.js desactivando wrap por div en render

<option value=""><%= title %></option> 

Pero finalmente lo consigo envuelto con div. ¿Hay alguna solución para no envolver esta plantilla con <div>?

Respuesta

32

Si no define un el (o tagName) para la vista (en la clase o durante la creación de instancias), la vista se colocará dentro de una etiqueta div. http://documentcloud.github.com/backbone/#View-el

var PostView = Backbone.View.extend({ 
    tagName: 'option' 
}); 

ACTUALIZACIÓN

partir v0.9.0, soporte estructural tiene view.setElement (elemento) para hacer esto.

var PostView = Backbone.View.extend({ 
    initialize: function() { 
     var template = _.template('<option value=""><%= title %></option>'); 
     var html = template({title: 'post'}); 
     this.setElement(html); 
    } 
}); 
+1

Intenté este enfoque también, pero no puedo ver una forma de pasar la variable de "valor" dentro de esta etiqueta

+0

Dentro de su vista puede usar jquery para establecer el valor '$ (this.el) .attr ('value', 'something');' – kreek

+4

o incluso 'this.el.value = 'something'' leave jQuery para donde es necesario :) –

18

Si no quiere tener la opinión de envolver el código HTML, que tendrá que hacer algunas cosas:

  1. Reemplazar this.el totalmente
  2. llamada delegateEvents en el nuevo el
render: function(){ 
    var html = "some foo"; 
    this.el = html; 
    this.delegateEvents(this.events); 
} 

Desde Backbone genera un div u otra etiqueta (en función de su configuración tagName para la vista), debe reemplazarla por completo. Eso es fácil de hacer. Sin embargo, cuando haces eso, pierdes tus eventos declarados porque Backbone usa el delegate de jQuery debajo del capó para conectarlos. Para volver a habilitar sus eventos declarados, llame al delegateEvents y pase sus declaraciones de eventos.

El resultado es que su view.el será la etiqueta <option> que desee, y nada más.

+0

Muchas gracias por su ayuda, Derick. Usaré tu consejo en mis proyectos futuros/ – BazZy

+0

, no tienes que pasar this.events para delegarEventos, por defecto será eso. – troynt

+8

hay una función para esto en la última versión de BB - [view.setElement (html)] (http://documentcloud.github.com/backbone/#View-setElement) – zihotki