Tengo una configuración de Vista anidada que puede ser algo profunda en mi aplicación. Hay muchas maneras en las que podría pensar en inicializar, renderizar y agregar las vistas secundarias, pero me pregunto qué es una práctica común.
Aquí hay una pareja en la 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: no tiene que preocuparse por mantener el orden DOM correcto con los anexos. Las vistas se inicializan desde el principio, por lo que no hay tanto que hacer a la vez en la función de renderizado.
Contras: ¿ Estás obligado a volver a delegar eventos (), lo que puede ser costoso? ¿La función de representación de la vista principal está abarrotada con toda la representación de subvista que debe suceder? No tiene la capacidad de establecer los tagNameelementos, por lo que la plantilla debe mantener los nombres de etiqueta correctos.
De otra manera:
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: no tiene que volver a delegar eventos. No necesita una plantilla que solo contenga marcadores de posición vacíos y la etiqueta vuelve a definir su nombre de etiqueta.
Contras: ahora debe asegurarse de agregar las cosas en el orden correcto. El renderizado de la vista principal todavía está abarrotado por el renderizado de la subvista.
Con un onRenderevento:
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 de la subvista ahora está separada del render()método de la vista .
Con un onRenderevento:
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 mezclado y comparado un montón de prácticas diferentes en todos estos ejemplos (lo siento mucho), pero ¿cuáles son las que mantendría o agregaría? y que no harias
Resumen de prácticas:
- ¿Instanciar subvistas en
initializeo enrender? - ¿Realiza toda la lógica de representación de subvista en
rendero enonRender? - Usar
setElementoappend/appendTo?
closemétodo y un método onCloseque limpia a los niños, pero tengo curiosidad acerca de cómo crear instancias y renderizarlos en primer lugar.
deleteen JS no es lo mismo que deletedesde C ++. Es una palabra clave muy mal nombrada si me preguntas.