7

无法显示、隐藏和重新显示 Marionette 布局。我相信这个问题也适用于常规的 Backbone Views 和 Marionette ItemViews。

总之,我有一个父视图。初始化时,它会创建两个子布局,用作选项卡内容。问题是,当显示来自一个选项卡的选项卡内容时,会显示来自另一个选项卡的内容,当再次显示原始选项卡内容时,事件不再起作用。

子布局是在initialize父布局的函数中创建并重新使用的,因为当导航移回它们时需要保留它们的状态。

这是一个示例应用程序,它演示了我在说什么:

在此处输入图像描述

这是显示损坏事件的视频:视频链接

非常感谢!

4

2 回答 2

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());
}
于 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 回答