簡體   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