未关注事件处理程序“失去焦点”

时间:2012-11-02 09:45:05

标签: backbone.js

我试图尽可能清楚地说出这一点。

我有一个显示表单的视图。我将事件处理程序绑定到提交按钮,如下所示:

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

在保存功能中,成功之后,在我离开之前,我会注意undelegateEvents():

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

所以,如果有人来到这个页面,提交页面并转到(实际上:被送回)主页,那就好了。

但是,此处还显示了一个“主页”链接,它是顶级模板的一部分。它的指定如下:

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

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

鉴于我有很多观点,导航可以通过多种方式发生,当导航以更高(不可控制)的方式发生时,undelegateEvents的常见模式是什么?或者我做了一些根本错误的事情?

1 个答案:

答案 0 :(得分:0)

在您的情况下,您不需要取消发布事件。只需使用$('el').remove()从DOM中删除您的表单,javascript事件就会自动删除

最佳解决方案是在同一个容器中分别设置HomepageViewFormView(请说.container)。

完整方案的示例:

  • 用户转到#homepage,我们实例化HomepageView并在.container
  • 中呈现它
  • 用户转到#form,我们实现FormView并在.container
  • 中呈现它
  • 用户转到#homepage,我们实例化HomepageView并在.container
  • 中呈现它
  • ......等等

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

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

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

阅读此blog post了解更多信息。