在Meteor中取消绑定关键事件?

时间:2015-05-19 13:35:53

标签: javascript meteor

我有一个有关键事件的模板

Template.layout.events({
  'keyup': function (e, template) {
    if (e.keyCode === 13) {
      e.preventDefault();
      // do some stuff here, isn't important for question
      Router.go('Users.profile', { _id: id });
    }
  }
});

但是,当我更改页面时,似乎事件仍然与输入按钮绑定。

我想第一步是在我的模板上使用onDestroyed回调。

Template.layout.onDestroyed(function () {
  // ???
});

如何解除流星中页面更改的关键事件?

2 个答案:

答案 0 :(得分:1)

Meteor本身并不支持删除通过Template.name.events添加的事件。在这种情况下,我可以想到几个决议:

  1. 处理事件处理程序中的特殊情况,这意味着将处理程序与应用程序逻辑的其余部分耦合。这可能适合您的需求,也可能不适合您。
  2. 使用jQuery附加(命名空间)事件处理程序.onRendered,然后显式删除.onDestroyed
  3. keyup事件更紧密地绑定到焦点元素。如果从DOM中删除该元素,则也将删除该处理程序。

答案 1 :(得分:1)

模板销毁时会自动销毁事件处理程序。但是,使用layout之类的名称,我猜这个模板存在于多个路由上。如果是这种情况,请向console.log添加onDestroyed(),看看它是否会在您需要时被销毁。要解决此问题,请将keyup侦听器附加到更具体的模板上,例如,如果您有此

<template name="layout">
  {{>settingsMenu}}
</template>

并假设您只想要“输入”在设置菜单上执行某些操作,请使用:Template.settingsMenu.events 然后,当settingsMenu被销毁时,事件处理程序也是如此。 如果您奇怪地没有一个(即当前路线上没有一个唯一的模板),请创建一个:

<template name="settingsMenu">
</template>

{{>settingsMenu}}

Template.settingsMenu.events({...

此外,一个丑陋的修复方法是在事件的顶部添加条件: if (Router.current().route.getName() === 'settingsMenu')...我称之为丑陋,因为那里仍然有一个流氓事件监听器,除了你指定的路线之外,它对你们来说都是无害的。