1

我在我的 Rails 应用程序中使用 CoffeeScript,我需要延迟远程 ajax 表单提交,我遇到的主要问题是取消请求,以便在 250 毫秒过去后发送表单,而无需用户输入表单.

现在我有一些看起来像这样的事情,显然它不会工作,所以它有一些调试输出来帮助我。

看看下表,你应该知道我要“去抖动”的函数在 element.keyup (event) ->函数内部,任何帮助都会很神奇!

remoteTable =

  bindEvents: (element) ->
    element.keyup (event) ->
      console.log(event)


  send: (event) ->
    console.log(event)

** 如果我能收集一些例子来说明它是如何工作的,那会非常有帮助吗?** 我确实看到了 underscore.js 的做法,但是在这里,这是我的旧方法:我只是无法理解这应该如何工作:

http://davidwalsh.name/function-debounce

4

2 回答 2

1

我在 coffeescript.org 上玩过,他们有一个在线“try coffeescript”翻译器/运行器,看起来

remoteTableOrg =
  bindEvents: (element) ->
    element.keyup (event) ->
      console.log(event)
  send: (event) ->
    console.log(event)

翻译成

var remoteTableOrg;

remoteTableOrg = {
  bindEvents: function(element) {
    return element.keyup(function(event) {
      return console.log(event);
    });
  },
  send: function(event) {
    return console.log(event);
  }
};

所以element.keyup实际上是一个以函数为参数的函数调用。

看到这个,我试了

remoteTable =
  bindEvents: (element) ->
    element.keyup _.debounce((event) ->
      console.log(event)
    ,250)
  send: (event) ->
    console.log(event)

并得到:

var remoteTable;

remoteTable = {
  bindEvents: function(element) {
    return element.keyup(_.debounce(function(event) {
      return console.log(event);
    }, 250));
  },
  send: function(event) {
    return console.log(event);
  }
};

我没有尝试过任何事情,但我不知道为什么这不起作用。我不得不承认对咖啡脚本做的不多,但它看起来很简单。

于 2012-12-22T07:36:23.573 回答
1

您可以为此使用简单的超时,无需花哨。

remoteTable =
  bindEvents: (element) ->
    timeout = null
    element.keyup (event) ->
      clearTimeout(timeout)
      timeout = setTimeout(remoteTable.send, 250)

  send: ->
    console.log('Sending request...')
于 2012-12-23T03:58:37.620 回答