以下内容更新了用户Document
上的input
集合(延迟了树秒):
Template.documentPage.events({
'input .content': function(e) {
// to make Tracker.autorun rerun
Session.set('currentPostId',this._id)
var currentPostId = Session.get('currentPostId')
// to make setTimeout work
Tracker.autorun(function() {
setTimeout(function() {
var savedSel = rangy.saveSelection()
var content = $(e.target).html()
Documents.update(currentPostId, {$set: {content: content}}, function(){
rangy.restoreSelection(savedSel)
console.log('saved')
})
}, 3000)
})
},
所以,如果我输入两次2 saved
,如果我输入3次,那么我现在会看3
,依此类推。我该怎么做才能在每次用户输入时重置事件?所以我最终只使用1 saved
(最后一个)?
修改
我试过这个
Tracker.autorun(function(c) {
c.stop()
setTimeout(function() {
而且:
Tracker.autorun(function(c) {
clearTimeout(timer)
var timer = setTimeout(function() {
但没有工作。
使用下划线_.debounce
无效:
Tracker.autorun(function() {
_.debounce(function() {
var savedSel = rangy.saveSelection()
var content = $(e.target).html()
Documents.update(currentPostId, {$set: {content: content}}, function(){
rangy.restoreSelection(savedSel)
console.log('saved')
})
}, 3000)
})
答案 0 :(得分:4)
简短的回答是,您希望_.debounce
输入事件而不是Document.update
来电:
Template.documentPage.events({
'input .content': _.debounce(function(e) { ... }, 3000)
});
说明:
下划线的_.debounce
如何工作是它返回一个包装原始函数的函数。 _.debounce
返回的这个新函数在每次调用时都会自行运行,在内部使用一些setTimeouts
。
这里的关键是_.debounce
通过返回一个特殊函数来工作 - _.debounce
本身只是一个没有固有时间调节能力的常规函数。
说完这些之后,让我们回到你的例子。通常使用'input .content'
,每次输入更改时,都会再次调用输入事件。这意味着通过将_.debounce
函数放在事件处理程序中,您所做的只是一次又一次地调用_.debounce
(普通函数,而不是特殊返回函数),每次丢弃返回值。实际上,Document.update
永远不会被触发,仅用作快速丢弃的_.debounce
函数的参数。
如果你将_.debounce
包裹在事件处理程序本身周围,输入事件现在会在每次输入更改时触发特殊的返回函数,这是所希望的,因为这个特殊函数知道如何推迟执行原始函数(去抖动函数的参数,这是你的原始事件处理程序。)
答案 1 :(得分:2)
您可以使用http://underscorejs.org/#debounce
_.debounce(function(){
Documents.update(currentPostId, {$set: {content: content}}, function(){
rangy.restoreSelection(savedSel)
console.log('saved')
})
}, 3000)