Backbone.Marionette view with subviews
在 Backbone.Marionete 环境中设置视图以拥有子视图列表的适当方法是什么,无需手动渲染它们,并尽可能少地消耗内存。
带有子视图的视图是基于模板呈现的,并且是选项卡控制选项卡的一部分。选项卡视图的 tamplete 有 div,它们用作子控件的占位符(两个集合视图和两个辅助控件)
我已经做了几个方法:
1) 在 render 方法中创建视图实例,并将它们附加到一个 propper el 硬编码 render 方法中的选择器。
2) 扩展一个木偶布局并为每个视图声明一个区域。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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) 我用以下逻辑扩展了木偶物品视图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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); } } } }); |
这让我可以编写以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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() }); } }); |
但它肯定会泄漏内存,而且我觉得我无法编写适当的代码来处理内存泄漏。
所以总的来说,我想要的是有一个很好的声明方式来创建一个视图,其中其他视图作为控件,防止内存泄漏和尽可能少的内存消耗......
附言对不起文字墙
您为什么不简单地使用布局并在布局区域内显示您的视图?你可以在这里看到一个例子:https://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/apps/contacts/list/list_controller.js#L43-L46