我有一個流星事件,它觀察一組用於更改的字段並相應地更新數據庫。爲了提高效率(如果誤導了我,請糾正我)我已經爲事件添加了一個油門,這樣它每秒最多隻會觸發一次。下劃線_.throttle如果在超時內發生模糊,則忽略輸入
事件:
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毫秒的超時時間內模糊了它的第一個字符似乎拿起來,即
'內森'打入name
字段很快並且模糊爲email
字段,將數據庫中的值返回爲'N'。
我的理解是,._throttle
函數將獲取字段值的最終結果 - 即使這意味着在1秒後收集它。
從docs:
默認情況下,油門將只要你把它 首次,而且,如果你在等待期間再次調用它任意次數 執行函數,一旦這段時間結束了。如果您希望 禁用前沿呼叫,請傳遞{leading:false},並且如果您希望禁用後沿執行,請傳遞{trailing: false}。
領先的邏輯似乎正常工作,因此初次「N」,但是我不打電話trailing: false
所以,除非我誤解最終值應始終收集。
任何想法?
我曾擔心是這樣的話 - 我敢肯定,你能想象它會增加相當代碼有很多冗餘(因爲我有十幾個幾乎相同的事件)。我最初考慮了debounce,但已經決定油門對我的用例更有意義 - 我會再看一次,因爲我可能只是誤解了。我擔心的更多的是,如果用戶正在完成一個沒有輸入暫停的大文本區域,並且無論出於何種原因會話死亡,那麼所有的輸入都會丟失 - 使用油門只會丟失最後的X秒輸入。這是一個邊緣案例。 –
在textarea的情況下,我想這是有道理的使用油門過去反彈。不過,您不必爲每個字段複製粘貼事件處理程序。 – user3374348
但您表示「因此解決方案是爲每個輸入字段分別設置一個限制事件處理程序」。 - 在這裏得到混合消息:) –