2

Layoutマリオネットがナビゲーションのような一種のスタックの作成に基づいているメカニズムを何らかの方法で拡張できるかどうかを知りたいです。

マリオネットの振る舞い。

region がビューになる前に、現在表示されているshow()ビューを呼び出します。のデストラクタとして機能し、すべてのイベントのバインドを解除し、イベントを無用にして、ガベージ コレクタが破棄できるようにします。close()close()view

私のシナリオ。

Layoutaがコントローラーとして機能し、最初にItemView呼び出された A を表示し、次にどこかをクリックすると B に切り替えることができる一種のナビゲーション メカニズムがあるとしますItemView。この時点で、B のアクション (たとえば、戻るボタンのタップなど) により、再作成せずに A に戻ります。

Aを再度作成してその状態を維持せずに、前のシナリオを達成するにはどうすればよいでしょうか?

iOS の人には、一種のUINavigationController.

何かアドバイス?

編集

私の目標は、以前にキャッシュされたビューを、再度作成せずにその状態で復元することです。

私のシナリオは次のとおりです。A と B の 2 つの領域を持つレイアウトがあります。A 内のどこかをクリックすると、A と B が閉じて C と D が表示されます。戻るをクリックすると、A と B がその状態で復元されます。イベント、モデルなど...しかし、ビューが閉じているため、イベントは削除されます。

4

2 に答える 2

3

@Simonの答えは正しい方向に向かっています。ただし、Marionette がビューを閉じないようにする唯一の方法は、Region コードを少し変更することです。

var NoCloseRegion = Marionette.Region.extend({
    open: function(view) {
        // Preserve the currentView's events/elements
        if (this.currentView) { this.currentView.$el.detach(); } 

        // Append the new view's el
        this.$el.append(view.el);
    }
});

レイアウト ビューを作成するときに、必ず新しい Region クラスを指定してください。

var Layout = Backbone.Marionette.Layout.extend({
    regions: {
        someRegion: {
            selector: 'my-region-jquery-selector',
            regionType: NoCloseRegion
        },
    },
    initialize: function () {
        this.createViews();
    },
    createViews: function () {
        this.views = {
            a: new Backbone.Marionette.ItemView,
            b: new Backbone.Marionette.ItemView
        };
    },
    showItemView: function (name) {
        // Don't `show`, because that'll call `close` on the view
        var view = this.views[name];
        this.someRegion.open(view)
        this.someRegion.attachView(view)
    }
});

showこれで、古いビューを閉じて新しいビューをレンダリングし、領域にアタッチする (そしていくつかのイベントをトリガーする)を呼び出す代わりに、古いビューをデタッチし、新しいビューをアタッチして開くことができます。

于 2013-10-22T21:33:21.023 に答える