2015-01-05 23 views
1

我是新来的主干,负责扩展和维护主干应用。backbone.js为每个视图触发的常见事件

我遇到了每个视图加载的“注销”按钮触发问题。我创建了一个基类普通视图事件:

BaseView = Backbone.View.extend({ 
    logout: function() { 
     console.log('logout'); 
    }, 
    events: { 
     'click .logout':'logout' 
    } 
}) 

我则在相关意见

DashboardView = BaseView.extend({ 
    el : '#app', 
    render: function(){ 
     this.$el.html(_.template($('#Dashboard').html())); 
     return this; 
    } 
}) 

所使用的模板有 <div class="logout"></div>

有按钮继承此构成我正在工作的网站部分的四个视图,如果所有四个视图都已加载,则单击时注销将触发四次。

我已经尝试了几件事情来解决这个问题,比如当它们改变时取消绑定视图,setElement没有成功。

首先,这是我应该解决的问题吗?如果是这样,我该怎么办?

干杯

+3

如何设置视图的el属性? – rednaw

+0

或者更一般地说,你如何渲染这4个视图?你可以发布你的'render()'方法吗? – AlexZ

+0

我已经更新了示例以包含'el'和渲染函数,渲染函数是相同的,但加载了不同的模板。欢呼 – hondac90

回答

0

我想我找到了解决方案。

事件功能,现在我打电话 this.undelegateEvents();

showview : function() { 
    this.undelegateEvents(); 
    app.appRouter.navigate("/dashboard", true); 
} 

,并在appRouter功能app.js我打电话this.DashboardView.delegateEvents();这样:

app.appRouter.on('route:dashboard', function(){ 
    app.dashboard = new DashboardView(); 
    app.dashboard.render(); 
    app.dashboard.delegateEvents(); 
)} 

我会很感兴趣知道这个解决方案是否有任何问题。

Regards

+0

即时发布的答案,很好,你发现:)这是正确的,在路线之前,取消关闭事件。顺便说一下,您不必调用'delegateEvents',因为它在初始化期间已经被调用 – ChinKang

0

骨干网使用jQuery的on注册DOM事件。
当你实例化4个视图时,如果4个事件监听器都定义了相同的父元素,它们将被绑定到相同的元素。

我个人倾向于使用window.location.href创建重定向,如果我当前位于需要验证的页面中。如果我在不需要身份验证的页面中,则只需重新呈现标题,用登录名(/ register)按钮替换用户名。