ネストされたビューのセットアップがあり、アプリケーションで多少深くなる可能性があります。サブビューを初期化、レンダリング、および追加する方法はたくさんありますが、一般的な方法は何なのでしょうか。
ここに私が考えたカップルがあります:
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();
}
長所:追加で正しいDOM順序を維持することを心配する必要はありません。ビューは早い段階で初期化されるため、render関数では一度にすべてを実行する必要はありません。
短所:コストがかかる可能性のあるredelegateEvents()を強制されますか?親ビューのレンダリング関数は、発生する必要のあるすべてのサブビューレンダリングで乱雑になりますか?tagName
要素のを設定する機能がないため、テンプレートは正しいtagNamesを維持する必要があります。
別の方法:
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);
}
長所:イベントを再委任する必要はありません。空のプレースホルダーのみを含むテンプレートは必要なく、tagNameはビューで定義された状態に戻ります。
短所:正しい順序で追加する必要があります。親ビューのレンダリングは、サブビューレンダリングによってまだ乱雑です。
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();
}
長所:サブビューのロジックがビューのrender()
メソッドから分離されました。
onRender
イベント:
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();
}
私はいくつかの種類を組み合わせて、これらすべての例でさまざまなプラクティスの束を一致させました(それで申し訳ありません)。そして、あなたは何をしませんか?
実践の要約:
initialize
またはでサブビューをインスタンス化しrender
ますか?- すべてのサブビューレンダリングロジックをで実行
render
しonRender
ますか? setElement
または使用しますかappend/appendTo
?
close
メソッドとを持っていonClose
ますが、最初にそれらをインスタンス化してレンダリングする方法に興味があります。
delete
JSのdelete
C ++ と同じではありません。あなたが私に尋ねると、それは非常に貧弱な名前のキーワードです。