0

我试图尽可能清楚地表达这一点。

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

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

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

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

所以如果有人来到这个页面,提交页面并转到(实际上是:被送回)主页,一切都很好。

但是,那里还显示了一个“主页”链接,它是顶层模板的一部分。它是这样指定的:

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

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

鉴于我有很多视图,并且导航可以通过多种方式发生,当导航以更高(不可控制)的方式发生时,取消委托事件的常见模式是什么?还是我做错了什么?

4

1 回答 1

0

在您的情况下,您不需要取消委托事件。只需从 DOM 中删除您的表单$('el').remove(),javascript 事件将自动被删除

最好的解决方案是将 aHomepageViewFormVieweach 放在同一个容器中(比如说.container)。

完整场景示例:

  • 用户转到#homepage,我们实例化 aHomepageView并将其渲染.container
  • 用户转到#form,我们实例化 aFormView并将其渲染.container
  • 用户转到#homepage,我们实例化 aHomepageView并将其渲染.container
  • ……等等等等

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

由于以前的视图 HTML 不再属于 DOM,因此您不再需要取消委托事件。

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

阅读这篇博文了解更多信息。

于 2012-11-03T23:48:41.663 回答