7

マリオネット レイアウトの表示、非表示、および再表示に問題があります。この問題は、通常の Backbone Views と Marionette ItemViews にも当てはまると思います。

要約すると、親ビューがあります。初期化されると、タブ コンテンツとして使用される 2 つの子レイアウトが作成されます。問題は、あるタブのコンテンツが表示されると、代わりに別のタブのコンテンツが表示され、元のタブのコンテンツが再び表示されると、イベントが機能しなくなることです。

子レイアウトはinitialize親レイアウトの機能で作成され、再利用されます。これは、ナビゲーションが戻ってきたときに状態を保持する必要があるためです。

これは、私が話していることを示すサンプル アプリケーションです。

ここに画像の説明を入力

壊れたイベントを示すビデオは次のとおりです:ビデオ リンク

本当にありがとう!

4

2 に答える 2

4

問題は、サブレイアウトの新しいインスタンスを作成せず、メイン レイアウトで開始したインスタンスを再利用するだけであることです。そのため、リージョンのコンテンツを変更すると、マリオネット ビューの close() 関数の一部としてイベントのバインドが解除されます。

次のように初期化関数を変更する必要があります。

initialize: function(){
    _.bindAll(this);
    // CREATE SUB LAYOUTS
   this.tab1Layout = B.tab1Layout;
   this.tab2Layout = B.tab2Layout;
},

そして、この方法でレイアウトを呼び出します:

// EVENT HANDLERS
on_show_tab_1_click: function(event){
    this.content.show(new this.tab1Layout());
},
on_show_tab_2_click: function(event){
    this.content.show(new this.tab2Layout());
}
于 2012-09-23T22:16:15.343 に答える
2

タブを変更するたびにタブビューを再初期化したくない場合は、view.delegateEvents()を手動で呼び出すことができます。

// views[] is array of initialized tab views
// Swap from displaying views[0] to views[1]
currentTabIndex = 1
this.myRegion.show(views[currentTabIndex])
views[currentTabIndex].delegateEvents()

状態を保持するための別のオプションは、両方のタブをレンダリングし、非アクティブなタブ領域を非表示にすることです。

// Assume both regions have initialised views, tab2Region is hidden, 
// tab1Region is shown.
// Swap between tabs:
this.tab1Region.$el.hide()
this.tab2Region.$el.show()
于 2013-02-14T20:54:18.467 に答える