2015-08-13 17 views
0

我有一個流星事件,它觀察一組用於更改的字段並相應地更新數據庫。爲了提高效率(如果誤導了我,請糾正我)我已經爲事件添加了一個油門,這樣它每秒最多隻會觸發一次。下劃線_.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所以,除非我誤解最終值應始終收集。

任何想法?

回答

1

兩個字段都使用相同的事件處理程序,因此如果第二個字段在1秒內觸發事件,則第一個字段中的某些事件將被抑制。如果您在1秒內在name字段中鍵入「Nathan」,您的處理程序將被調用name=N,然後在1秒後調用name=Nathan。但是,如果切換到email字段並在其中快速鍵入某些字符(例如「nathan @ e」),那麼這些事件將導致name=Nathan事件被抑制。在這種情況下,您將立即獲得name=N,並在1秒後獲得[email protected]

因此,解決方案是爲每個輸入字段分別設置一個限制事件處理程序。您不必到事件處理程序多次複製 - 粘貼 - 你可以使用這樣的方法:

var throttledFunctions = {}; 
["name", "email"].forEach(function (fieldName) { 
    throttledFunctions[fieldName] = _.throttle(function (context, event) { 
     Meteor.call("updateForm", context._id, event.target.name, event.target.value, ...) 
    }, 1000); 
}); 

Template.TheForm.events({ 
    "input #TheForm .field": function (event) { 
     throttledFunctions[event.target.name](this, event); 
    } 
}); 
+0

我曾擔心是這樣的話 - 我敢肯定,你能想象它會增加相當代碼有很多冗餘(因爲我有十幾個幾乎相同的事件)。我最初考慮了debounce,但已經決定油門對我的用例更有意義 - 我會再看一次,因爲我可能只是誤解了。我擔心的更多的是,如果用戶正在完成一個沒有輸入暫停的大文本區域,並且無論出於何種原因會話死亡,那麼所有的輸入都會丟失 - 使用油門只會丟失最後的X秒輸入。這是一個邊緣案例。 –

+0

在textarea的情況下,我想這是有道理的使用油門過去反彈。不過,您不必爲每個字段複製粘貼事件處理程序。 – user3374348

+0

但您表示「因此解決方案是爲每個輸入字段分別設置一個限制事件處理程序」。 - 在這裏得到混合消息:) –