3

CompositeView を使用して、イベントが発生した画像のグリッドを作成しています。これは次のようになります。

Backbone.Marionette.CompositeView.extend({

    events: {
        'click li.feed-thumb': 'clickElement',
    },

    template: _.template(template),

    itemView: ItemFeedView,
    itemViewContainer: "#feed ul.feed",

    clickElement: function(event) { 
        var profile = new ProfileFeedView();

    }
});

この CompositeView のテンプレートには<li>、画像をクリックしたときにプロファイルをレンダリングする要素が含まれています。<li>画像をクリックするすべてのイベントに同じものを使用します。これをリージョンとして処理したいと思います。リージョン マリオネットとして実行すると、ビューの開閉が処理されることを理解しているからです。

CompositeView は をサポートしていないと思いregions: {profileRegion: '#feed-profile'}ます。オプションは何ですか?

前もって感謝します!

4

3 に答える 3

4

必要な数のリージョンを指定できるレイアウト ビューを使用する必要があります。これにより、複合ビューを配置できるリスト リージョンと、プロファイルをレンダリングするアイテム ビューを配置できるプロファイル リージョンを作成できます。 .

Marionette のドキュメント -- レイアウト ビュー

于 2013-07-21T23:54:33.360 に答える
3

何らかの理由で CompositeView にリージョンが必要な場合は、次のようにすることもできます。

var YourView = Backbone.Marionette.CompositeView.extend({
    regions: {
       "someRegion": ".someRegionClass"
    },
    "initialize": function(options) {
       this._initializeRegions(options);
    },
    "onDestroy": function() {
       this.regionManager.destroy();
    }
})
_.each(["_initializeRegions", "_initRegionManager",
        "_buildRegions", "addRegion", "addRegions",
        "removeRegion", "getRegion", "getRegions",
        "_reInitializeRegions", "getRegionManager"], function(prop) {
    PaginatorView.prototype[prop] = Marionette.LayoutView.prototype[prop];
});

正直なところ、動作しますが、完全な機能についてはテストしていません。

view.someRegion.show(otherView) は機能します。

(私が推測する他のビューでも機能します。もちろん、ビューを拡張するために必要な他のオプションを追加する必要があります)

于 2014-09-19T14:18:07.463 に答える
0

Manfred が言ったことに加えて、Marionette Composite View で次のように実装しました。

View.ListView = Marionette.CompositeView.extend({
    template: listTpl,
    emptyView: noItemsTpl,
    childView: View.ListItem,
    childViewContainer: '#items-list',

    regions: {
       "someRegion": "#someRegion"
    },

    initialize: function(options) {
        //give this composite view a LayoutView behaviour with added region manager
        this.regionManager = new Marionette.RegionManager();
        _.each(["_initializeRegions", "_initRegionManager",
                "_buildRegions", "addRegion", "addRegions",
                "removeRegion", "getRegion", "getRegions",
                "_reInitializeRegions", "getRegionManager"], function(prop) {
            Marionette.CompositeView.prototype[prop] = Marionette.LayoutView.prototype[prop];
        });
        var that = this;
        _.each(this.regions, function(value, key) {
            var region = that.addRegion(key, value);
            that[key] = region;
        });
    },

    onDestroy: function() {
       this.regionManager.destroy();
    }
});

このようにして、LayoutView インスタンスとまったく同じ方法で CompositeView インスタンスを操作できます。

var listView = new View.ListView({ ... });
var anotherView = new View.AnotherView({ ... });
listView.someRegion.show(anotherView);
于 2016-10-17T13:58:36.403 に答える