7

マリオネットレイアウトの表示、非表示、再表示に問題があります。この問題は通常のBackbone ViewsとMarionette ItemViewsにも当てはまります。レイアウトを表示、非表示、再表示、ブレークイベント

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

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

は、私が何を言っているかを示しているsample applicationです:Video Link

本当にありがとうございました:

enter image description here

ここで壊れたイベントを示すビデオです!

+1

この質問は、downvotedてしまったことを少し驚き... –

+1

私はこれをdownvotedか分からないが、私は質問が研究、努力が認められたと思いました、そして明確さ。 –

答えて

4

問題は、サブレイアウトの新しいアイシャンスを作成せず、メインレイアウトで開始したものを再利用することです。したがって、あなたの地域のコンテンツを変更すると、イベントはMarionetteのビューの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()); 
} 
+0

子レイアウトの状態を保持する必要があります。毎回子レイアウトを再作成せずにこれを行う方法はありますか? –

+0

サブレイアウトの 'close()'関数をオーバーライドして、イベントを閉じても取り消されないようにすると思います。元のクローズ機能(行182)のバックボーン・マリネットのソースコードをチェックし、必要に応じて「軽い」バージョンを作成してみてください。 – Ingro

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