代码之家  ›  专栏  ›  技术社区  ›  Chris Dutrow

显示、隐藏,然后重新显示布局中断事件

  •  7
  • Chris Dutrow  · 技术社区  · 13 年前

    在显示、隐藏和重新显示Marionette布局时出现问题。我相信这个问题也适用于常规的主干视图和Marionette项目视图。

    总之,我有一个家长观点。初始化后,它将创建两个子布局,这两个子布局将用作选项卡内容。问题是,当显示一个选项卡中的选项卡内容时,会显示另一个选项卡的内容,而当再次显示原始选项卡内容时则事件不再起作用。

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

    这是一个 sample application 这说明了我所说的:

    enter image description here

    以下是一段视频,显示了破碎的事件: Video Link

    非常感谢!

    2 回复  |  直到 13 年前
        1
  •  4
  •   Ingro    13 年前

    问题是,您不会为子布局创建新的距离,而只是重复使用您在主布局中启动的距离。因此,当您更改区域的内容时,作为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());
    }
    
        2
  •  2
  •   Rudolf Meijering    13 年前

    如果您不想在每次更改选项卡时重新初始化选项卡视图,可以手动调用view.deleteEvents():

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