2012-11-02 21 views
0

我想尽可能清楚地说明这一点。undelegating事件处理程序'失去重点'

我有一个视图,显示一个窗体。我绑事件处理程序的提交按钮这样的:

events: { 
    'click #bsubmit': 'save' 
} 

在保存功能,如果成功,我照顾到undelegateEvents()之前,我导航离开:

... 
that.undelegateEvents(); 
window.router.navigate('#/home'); 
... 

因此,如果有人来到这个页面,提交页面并返回(其实是回传)主页,都很好。

但是,此处还显示一个“主页”链接,其中显示顶级模板的哪一部分。它被指定这样的:

<a href="#/home">Home</a> 

因此,如果有人谈到这个页面,点击主页链接,(从那里)返回到该页面,该事件被映射了第二次。现在当有人提交表单时,它会被提交两次。

鉴于我有很多视图,并且导航可能以多种方式发生,导航发生在更高(不可控)方式时,undelegateEvents的常见模式是什么?或者我在做一些根本性错误?

+0

每次要导航到主页时,是否要调用that.undelegateEvents()? – Pramod

+0

我正在寻找一种方法,以便在任何有意外的导航时从任何视图中调用undelegateEvents()。在家中,可以打开view1,view2等,从每个视图中都可以返回到主页。每次我们需要从视图中取消undelegateEvents,或者找到一些其他方式来取消关闭事件(从视图外部)。这就是为什么在标题中失去焦点。 –

+0

也许您可以使用Backbone.Events在发生'意外'情况时触发事件并让回调监听事件。在回调中,您可以undelegateEvents() – Pramod

回答

0

在你的情况下,你不需要取消事件。只需从DOM与$('el').remove()删除您的形式,JavaScript事件将自动被删除

最好的解决办法是有一个HomepageViewFormView每个在同一容器(让说.container)。一个完整的情景

例子:

  • 用户去#homepage,我们实例化一个HomepageView,呈现在.container
  • 用户去#form,我们实例化一个FormView,呈现在.container
  • 用户去#homepage,我们实例化一个HomepageView,呈现在.container
  • ...等,等

因此,每次用户导航到新路线时,前一个视图将被新路线替换。

由于之前的视图HTML不再属于DOM,因此您不需要再取消关闭事件。

当然,.container元素不属于我们的视图,每个视图都有它自己的元素在.container元素内呈现。

阅读blog post了解更多信息。

+0

这个答案显示了方式。另外的事情是我在视图中使用了el,而不是tagName,el中的id是静态外部模板的一部分。所以删除视图删除了id本身,然后没有其他工作(因为我写我的代码的方式)..我用tagName替换了el,并使渲染函数附加到#id。这是行得通的。我仍然可能无效地做事,但这个答案已经足够接近了。公认。 –