我有一个meteor事件,它监视一组字段以进行更改,并相应地更新数据库。为了提高效率(如果被误导,请纠正我)我为事件添加了一个油门,这样它最多只会每秒一次。
事件:
Template.TheForm.events({
"input #TheForm .field": _.throttle(function (event) {
// Update field
Meteor.call("updateForm", this._id, event.target.name, event.target.value, function(error, result){
// Do someting here
});
}, 1000) // Throttle to fire at most once every second
});
形式:
<form id="TheForm">
<fieldset id="person">
<legend>The person</legend>
<label for="name">Name</label>
<input id="name" type="text" name="name" class="field" value="{{ name }}" />
<label for="email">Email</label>
<input id="email" type="email" name="email" class="field" value="{{ email }}" />
</fieldset>
</form>
问题在于,如果我填充一个字段并在1000毫秒超时内模糊,只有第一个字符似乎被拾取,即
'Nathan'快速输入name
字段并模糊到email
字段,看到数据库中的值返回为'N'。
我的理解是._throttle
函数将获取字段值的最终结果 - 即使它意味着在1秒后收集它。
来自docs:
默认情况下,只要您调用它,throttle就会执行该功能 这是第一次,如果你再次多次调用它 在等待期间,一旦这段时间结束。如果你愿意的话 要禁用前沿呼叫,请传递{leading:false},如果你是 喜欢在尾端禁用执行,传递{trailing: 假}。
主导逻辑似乎工作正常,因此最初的'N',但我不是在调用trailing: false
,所以除非我误解了最终值,否则应该总是收集。
有什么想法吗?
答案 0 :(得分:1)
您的两个字段都使用相同的事件处理程序,因此如果第二个字段在1秒内触发事件,则会抑制第一个字段中的某些事件。如果您在1秒内在name
字段中输入“Nathan”,则会在name=N
之后调用您的处理程序,然后在{1}}之后调用1秒。但是如果切换到name=Nathan
字段并在那里输入一些字符(比如说“nathan @ e”),那么这些事件将导致email
事件被抑制。在这种情况下,您将立即获得name=Nathan
并在1秒后获得name=N
。
因此,解决方案是为每个输入字段设置一个单独的限制事件处理程序。您不必多次复制粘贴事件处理程序 - 您可以使用这样的方法:
email=nathan@e