在 Ext 3.4 框架上使用 debounce

Use of debounce on Ext 3.4 framework

我想在Ext.Button上实现去抖动功能,所以我扩展了它并覆盖了onClick功能,像这样:

MyButton = Ext.extend(Ext.Button, {
    onClick:  function(e) {
        var that = this;
        var args = e;
        clearTimeout(this.timeoutDebounce);

        this.timeoutDebounce = setTimeout(function(){
                  MyButton.superclass.onClick.apply(that, [args])
        }, this.debounce);
    }
});

Debounce 是在 x 类型声明上传递的参数。

这里的问题是我传递给 onClick 的 "args" 参数在被调用时从 "click" 更改为 "mouvemove" 并且它没有触发它应该触发的事件.

有没有办法记录函数中接收到的"e"参数传递给超类上的onClick?

您应该克隆对象:

var args = Ext.apply({}, e);

this.timeoutDebounce = setTimeout((function(args){
    return function(){MyButton.superclass.onClick.apply(that, [args])};
})(args), this.debounce);

必须包装传递给 setTimeout 的函数,以保持当前范围内显示的值:

function createCallback(args) {
  return function() {
    MyButton.superclass.onClick.apply(that, [args]);
  }
}

此外,e 是通过引用传递的,因此您需要创建它的副本。使用ExtJS,可以使用Ext.apply方法:

Ext.apply({}, e);

完整代码应该是:

var MyButton = Ext.extend(Ext.Button, {
  onClick: function(e) {
    var that = this;
    function createCallback(args) {
      return function() {
        MyButton.superclass.onClick.apply(that, [args]);
        // you can also use call since you know the arguments:
        // MyButton.superclass.onClick.call(that, args);
      }
    }

    clearTimeout(this.timeoutDebounce);

    var copy = Ext.apply({}, e);
    this.timeoutDebounce = setTimeout(createCallback(copy), this.debounce);
  }
});