Backbone.js 在';失去焦点';

Backbone.js 在';失去焦点';,backbone.js,Backbone.js,我正在尽可能清楚地表达这一点 我有一个显示表单的视图。我将事件处理程序绑定到submit按钮,如下所示: events: { 'click #bsubmit': 'save' } <a href="#/home">Home</a> 在save函数中,如果成功,我会在导航之前先取消legateevents(): ... that.undelegateEvents(); window.router.navigate('#/home'); ... 因此,如果有人来

我正在尽可能清楚地表达这一点

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

events: {
    'click #bsubmit': 'save'
}
<a href="#/home">Home</a>
在save函数中,如果成功,我会在导航之前先取消legateevents():

...
that.undelegateEvents();
window.router.navigate('#/home');
...
因此,如果有人来到这个页面,提交该页面并转到(实际上:被发送回)主页,这一切都很好

但是,这里还显示了一个“主页”链接,它是顶级模板的一部分。具体规定如下:

events: {
    'click #bsubmit': 'save'
}
<a href="#/home">Home</a>

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


考虑到我有很多视图,并且导航可以以多种方式进行,当导航以更高(不可控)的方式进行时,取消事件的常见模式是什么?还是我做了一些根本错误的事情?

在您的情况下,您不需要取消对事件的授权。只需使用
$('el')从DOM中删除表单即可。remove()
,javascript事件将自动删除

最好的解决方案是将
主页视图
表单视图
分别放在同一个容器中(比如说
.container

完整场景的示例:

  • 用户进入#主页,我们实例化一个
    主页视图
    ,并将其呈现在
    容器中
  • 用户转到#表单,我们实例化一个
    FormView
    ,并在
    .container
  • 用户进入#主页,我们实例化一个
    主页视图
    ,并将其呈现在
    容器中
  • …等等,等等
因此,每次用户导航到新路线时,以前的视图都会被新的视图替换

由于前面的视图HTML不再属于DOM,因此您不再需要取消对事件的委派

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


阅读本文了解更多信息。

是否每次要导航到主页时都要调用.undelegateEvents()?我正在寻找一种方法,每当出现“意外”导航时,可以从任何视图调用undelegateEvents()。从主页上,可以打开view1、view2等,从这些视图中的每一个都可以返回主页。每次我们都需要(从视图中)取消对事件的委派,或者找到其他方法(从视图外部)取消对事件的委派。这就是标题中“失去焦点”的原因。也许您可以使用主干.Events在“意外”情况发生时触发事件,并让回调侦听事件。在回调中,您可以取消legateevents()如何编写此“回调”以及如何从每个视图调用它。您可以让任何对象触发此事件。事件不必是视图的一部分。我想您可以从视图之外取消对事件的委派。这个答案为您指明了方向。另外,我在视图中使用el,而不是标记名,el中的id是静态外部模板的一部分。因此,删除视图会删除id本身,然后其他一切都不起作用(因为我编写代码的方式)。。我将el替换为标记名,并将渲染函数附加到#id。这是可行的。我仍然可能做的事情效率低下,但这个答案已经足够接近了。认可的。