1

Backbone.Marionete 環境でビューをセットアップして、サブビューを手動でレンダリングせずにサブビューのリストを作成し、可能な限りメモリを消費しないようにするための適切なアプローチは何ですか。

子ビューを含むビューは、テンプレートに基づいてレンダリングされ、タブ コントロール タブの一部です。タブ ビューの tamplete には、子コントロール (2 つのコレクション ビューと 2 つのヘルパー コントロール) のプレースホルダーとして使用される div があります。

私がすでに行ったいくつかのアプローチ:

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

しかし、確実にメモリ リークが発生します。メモリ リークを処理する適切なコードを記述できるとは思えません。

したがって、一般的に、私が望むのは、メモリリークから保護し、可能な限りメモリ消費を最小限に抑えて、他のビューをコントロールとしてビューを作成するための優れた宣言的な方法を持つことです...

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 に答える