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: { className: ‘team-goals’, initialize: function () { this.homeFilterView = new SwitchControlView({ this.awayFilterView = new SwitchControlView({ this.??ontentView = new GoalsCollecitonView({ onShow: function () { |
这是很酷的方法,但我担心维护区域集合的开销,它总是显示单个视图。
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 rendered = view.render().$el; //if (rendered.is(‘div’) && !rendered.attr(‘class’) && !rendered.attr(‘id’)) { 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’, ui: { initialize: function () { this.views.homeFilter = new SwitchControlView({ this.views.awayFilter = new SwitchControlView({ this.views.content = new AssistsCollecitonView({ |
但它肯定会泄漏内存,而且我觉得我无法编写适当的代码来处理内存泄漏。
所以总的来说,我想要的是有一个很好的声明方式来创建一个视图,其中其他视图作为控件,防止内存泄漏和尽可能少的内存消耗……
附言对不起文字墙
您为什么不简单地使用布局并在布局区域内显示您的视图?你可以在这里看到一个例子:https://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/apps/contacts/list/list_controller.js#L43-L46
- 我这样做了(方法 2),团队的其他成员害怕创建区域的开销只是为了显示一件事。
- “过早的优化是万恶之源” :-) 实际上,开销将是微不足道的,并且绝对小于自制方法可能导致的任何内存泄漏……
来源:https://www.codenong.com/17489773/