template - Backbone.js desactivando wrap por div en render
underscore js que es (3)
Tengo postes modelo de publicación y colección. Y quiere hacer una forma con la lista de todas las publicaciones en <select id="multi" multiple="multiple">
. Así que tengo que hacer un renderizado PostView dentro de mi #multi con solo esta plantilla:
<option value=""><%= title %></option>
Pero finalmente lo envuelvo con div. ¿Hay alguna solución para no envolver esta plantilla con <div>
?
En la versión 0.9.0, Backbone introdujo view.setElement(element)
para manejar esta operación.
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''
});
ACTUALIZAR
Comenzando v0.9.0, Backbone 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);
}
});
Si no desea que la vista ajuste su HTML, deberá hacer algunas cosas:
- Reemplace
this.el
completo - Llame a
delegateEvents
en el nuevoel
render: function(){
var html = "some foo";
this.el = html;
this.delegateEvents(this.events);
}
Como Backbone genera una div
u otra etiqueta (en función de su configuración de 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 tus eventos declarados, llama a delegateEvents
y pasa tus declaraciones de eventos.
El resultado es que su view.el
será la etiqueta <option>
que desee, y nada más.