Backbone.Marionete 環境でビューをセットアップして、サブビューを手動でレンダリングせずにサブビューのリストを作成し、可能な限りメモリを消費しないようにするための適切なアプローチは何ですか。
子ビューを含むビューは、テンプレートに基づいてレンダリングされ、タブ コントロール タブの一部です。タブ ビューの tamplete には、子コントロール (2 つのコレクション ビューと 2 つのヘルパー コントロール) のプレースホルダーとして使用される div があります。
私がすでに行ったいくつかのアプローチ:
1) render メソッドでビュー インスタンスを作成し、それらを render メソッドでセレクターをハードコーディングする propper el にアタッチします。
2) marionete レイアウトを拡張し、各ビューのリージョンを宣言します。
var GoalsView = Marionette.Layout.extend({
template: '#goals-view-template',
regions: {
content: '#team-goals-content',
homeFilter: '#team-goals-home-filter',
awayFilter: '#team-goals-away-filter'
},
className: 'team-goals',
initialize: function () {
this.homeFilterView = new SwitchControlView({
left: { name: 'HOME', key: 'home' },
right: { name: 'ALL', key: 'all' },
});
this.awayFilterView = new SwitchControlView({
left: { name: 'AWAY', key: 'away' },
right: { name: 'ALL', key: 'all' },
});
this.сontentView = new GoalsCollecitonView({
collection: statsHandler.getGoalsPerTeam()
});
},
onShow: function () {
this.content.show(this.сontentView);
this.homeFilter.show(this.homeFilterView);
this.awayFilter.show(this.awayFilterView);
}
});
これはクールな方法ですが、常に単一のビューを表示するリージョン コレクションを維持するためのオーバーヘッドが心配です。
3) マリオネット アイテム ビューを次のロジックで拡張しました。
var ControlsView = Marionette.ItemView.extend({
views: {},
onRender: function() {
this.bindUIElements();
for (var key in this.ui) {
var view = this.views[key];
if (view) {
var rendered = view.render().$el;
//if (rendered.is('div') && !rendered.attr('class') && !rendered.attr('id')) {
// rendered = rendered.children();
//}
this.ui[key].html(rendered);
}
}
}
});
これにより、次のコードを書くことができました
var AssistsView = ControlsView.extend({
template: '#assists-view-template',
className: 'team-assists',
ui: {
content: '#team-assists-content',
homeFilter: '#team-assists-home-filter',
awayFilter: '#team-assists-away-filter'
},
initialize: function () {
this.views = {};
this.views.homeFilter = new SwitchControlView({
left: { name: 'HOME', key: 'home' },
right: { name: 'ALL', key: 'all' },
});
this.views.awayFilter = new SwitchControlView({
left: { name: 'AWAY', key: 'away' },
right: { name: 'ALL', key: 'all' },
});
this.views.content = new AssistsCollecitonView({
collection: statsHandler.getAssistsPerTeam()
});
}
});
しかし、確実にメモリ リークが発生します。メモリ リークを処理する適切なコードを記述できるとは思えません。
したがって、一般的に、私が望むのは、メモリリークから保護し、可能な限りメモリ消費を最小限に抑えて、他のビューをコントロールとしてビューを作成するための優れた宣言的な方法を持つことです...
PSテキストの壁でごめんなさい