我有一个有关键事件的模板
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 () {
// ???
});
如何解除流星中页面更改的关键事件?
答案 0 :(得分:1)
Meteor本身并不支持删除通过Template.name.events
添加的事件。在这种情况下,我可以想到几个决议:
.onRendered
,然后显式删除.onDestroyed
。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')...
我称之为丑陋,因为那里仍然有一个流氓事件监听器,除了你指定的路线之外,它对你们来说都是无害的。