关于 javascript:Backbone.Marionette 视图和子视图

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