Tengo una configuración de Vista anidada que puede ser algo profunda en mi aplicación. Hay muchas maneras en que podría pensar en inicializar, renderizar y agregar las sub-vistas, pero me pregunto qué práctica común es.Cómo renderizar y anexar sub-vistas en Backbone.js
Aquí hay un par que he pensado:
initialize : function() {
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
},
render : function() {
this.$el.html(this.template());
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
Pros: usted no tiene que preocuparse por mantener el orden DOM derecha con anexar. Las vistas se inicializan desde el principio, por lo que no hay tanto que hacer de una sola vez en la función de renderizado.
Contras: Te ves obligado a volver a delegarEvents(), ¿cuál puede ser costoso? ¿La función de representación de la vista principal está saturada con toda la representación de subvista que debe suceder? No tiene la capacidad de establecer el tagName
de los elementos, por lo que la plantilla necesita mantener los nombres de etiqueta correctos.
Otra forma:
initialize : function() {
},
render : function() {
this.$el.empty();
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
this.$el.append(this.subView1.render().el, this.subView2.render().el);
}
Pros: usted no tiene eventos de re-delegado. No necesita una plantilla que solo contenga marcadores de posición vacíos y los tagName vuelvan a estar definidos por la vista.
Contras: Ahora debe asegurarse de agregar las cosas en el orden correcto. El procesamiento de la vista principal aún está desordenado por la representación de la subvista.
con un evento onRender
:
initialize : function() {
this.on('render', this.onRender);
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
},
render : function() {
this.$el.html(this.template);
//other stuff
return this.trigger('render');
},
onRender : function() {
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
Pros: La lógica subvista está ahora separada del método render()
de la vista.
Con una onRender
evento:
initialize : function() {
this.on('render', this.onRender);
},
render : function() {
this.$el.html(this.template);
//other stuff
return this.trigger('render');
},
onRender : function() {
this.subView1 = new Subview();
this.subView2 = new Subview();
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
He tipo de mezclar y emparejar un montón de diferentes prácticas en todos estos ejemplos (tanto lo de eso), pero lo que son los que se mantendría o ¿añadir? y que no harias?
Resumen de las prácticas:
- subvistas instanciar en
initialize
o enrender
? - ¿Realiza toda la lógica de representación de subvista en
render
o enonRender
? - Utilice
setElement
oappend/appendTo
?
Tendría cuidado con lo nuevo sin eliminar, hay pérdida de memoria allí. – vimdude
No se preocupe, tengo un método 'close' y un' onClose' que limpia a los niños, pero tengo curiosidad acerca de cómo crear instancias y representarlos en primer lugar. –
@abdelsaid: en JavaScript, el GC maneja la desasignación de memoria. 'delete' en JS no es lo mismo que' delete' de C++. Es una palabra clave mal nombrada si me preguntas. –