7

無法顯示,隱藏,然後重新顯示木偶佈局。我相信這個問題也適用於普通的Backbone Views和Marionette ItemViews。顯示,隱藏,然後重新顯示佈局休息事件

總之,我有一個父視圖。初始化時,它會創建兩個子佈局,這些佈局旨在用作選項卡內容。問題是,如果顯示來自一個選項卡的選項卡內容,則會顯示來自另一選項卡的內容,而當原始選項卡內容再次顯示時,則該事件不再起作用。

子佈局在父佈局的initialize函數中創建並重新使用,因爲當導航移回到它們時,需要保留其狀態。

這裏是一個sample application演示什麼我談論:

enter image description here

下面是該破事件的視頻:Video Link

非常感謝!

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