如何在每次触发时重置跟随Meteor事件?

时间:2015-01-27 06:41:24

标签: javascript meteor

以下内容更新了用户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)
})

2 个答案:

答案 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)