Ho una configurazione di visualizzazione nidificata che può diventare un po 'profonda nella mia applicazione. Ci sono molti modi in cui potrei pensare di inizializzare, rendere e aggiungere le sotto-viste, ma mi chiedo quale sia la pratica comune.
Ecco un paio a cui ho pensato:
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();
}
Pro: Non devi preoccuparti di mantenere il giusto ordine DOM con l'aggiunta. Le viste vengono inizializzate all'inizio, quindi non c'è molto da fare tutto in una volta nella funzione di rendering.
Contro: sei costretto a ri-delegareEvents (), che potrebbe essere costoso? La funzione di rendering della vista padre è ingombra di tutto il rendering della sottoview che deve avvenire? Non hai la possibilità di impostare gli tagName
elementi, quindi il modello deve mantenere i tagNames corretti.
Un altro modo:
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);
}
Pro: non è necessario delegare nuovamente gli eventi. Non è necessario un modello che contenga solo segnaposto vuoti e i tagName tornino ad essere definiti dalla vista.
Contro: ora devi assicurarti di aggiungere le cose nel giusto ordine. Il rendering della vista padre è ancora ingombro dal rendering della vista secondaria.
Con un onRender
evento:
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();
}
Pro: la logica della vista secondaria ora è separata dal render()
metodo della vista .
Con un 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();
}
Ho un po 'mescolato e abbinato un sacco di pratiche diverse in tutti questi esempi (quindi mi dispiace per quello) ma quali sono quelli che vorresti mantenere o aggiungere? e cosa non faresti?
Riepilogo delle pratiche:
- Creare istanze secondarie in
initialize
o inrender
? - Eseguire tutta la logica di rendering della vista secondaria in
render
o inonRender
? - Usa
setElement
oappend/appendTo
?
close
metodo e un metodo per onClose
ripulire i bambini, ma sono solo curioso di sapere come creare un'istanza e renderli in primo luogo.
delete
in JS non è lo stesso delete
di C ++. È una parola chiave con un nome molto scarso se me lo chiedi.