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