繁体   English   中英

Backbone.Marionette视图与子视图

[英]Backbone.Marionette view with subviews

在Backbone.Marionete环境中设置视图以获得子视图列表的适当方法是什么,无需手动渲染它们,并尽可能少地使用memmory。

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

我已经做过几个方法:

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()
        });
    }
});

但它肯定会泄漏memmory,我觉得我不能编写正确的代码来处理memmory泄漏。

所以一般来说,我想要的是有一个很好的声明方式来创建一个视图与其他视图作为控件,保护再次memmory泄漏和最少的memmory消费可能...

PS对不起文字墙

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM