1

在 Backbone.Marionete 环境中设置视图以拥有子视图列表而不手动渲染它们并消耗尽可能少的内存的适当方法是什么。

带有子视图的视图是基于模板呈现的,并且是选项卡控制选项卡的一部分。选项卡视图的 tamplete 具有 div,用作子控件的占位符(两个集合视图和两个辅助控件)

我已经做了几个方法:

1)在render方法中创建视图实例,并将它们附加到propper el硬编码render方法中的选择器。

2) 扩展一个木偶布局并为每个视图声明一个区域。

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对不起文字墙

4

1 回答 1

3

为什么不简单地使用布局并在布局区域内显示视图?你可以在这里看到一个例子:https ://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/apps/contacts/list/list_controller.js#L43-L46

于 2013-07-05T14:18:51.270 回答