代码之家  ›  专栏  ›  技术社区  ›  KVNA

如何正确地确定聚合物延迟运行的功能范围?

  •  0
  • KVNA  · 技术社区  · 7 年前

    我试图将输入数据添加到一个数组中,该数组在最后一次击键后延迟了2秒。但是,当我运行此命令时,会出现以下错误: Uncaught TypeError: this._validateInput is not a function

    如何正确确定范围 this._validateInput() 延迟运行?

    我试过了 let func = this._validateInput(); ,但似乎每次设置func时都会运行该函数。

    此外,更改输入处理程序仅在输入失去焦点时激发。

    正在寻找解决此问题的方法。。。

    <paper-input id="itemId" on-input="_autoAddToArray"></paper-input>
    

    ...

    _validateInput () {
        console.log('validate input');
    }
    
    _autoAddToArray () {
      let timeout = null;
      clearTimeout(timeout);
      timeout = setTimeout(function () {
        this._validateInput();
      }, 2000);
    }
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Yorrd    7 年前

    使用lambda:

    setTimeout(
        () => this._validateInput(),
        2000
    );
    

    或绑定函数

    setTimeout(this._validateInput.bind(this), 2000);
    

    任何一种解决方案都应该有效


    lambda之所以有效,是因为它没有自己的作用域。 绑定之所以有效,是因为它在运行它之前应用了作用域

        2
  •  1
  •   Surya Subenthiran    7 年前

    这个 this 关键字始终指 当前作用域的,当您在function(){…}中包装某些内容时,它会发生更改

    您需要分配 在变量的外部范围中。

    var self = this;
    timeout = setTimeout(function () {
      self._validateInput();
    }, 2000);
    

    参考号: setTimeout scope issue

        3
  •  0
  •   KVNA    7 年前
    <paper-input id="itemId" on-input="_autoAddToArray"></paper-input>
    

    ...

    _autoAddToArray () {
      let timeout = null;
      clearTimeout(timeout);
        let that = this;
        timeout = setTimeout(function () {
          that._validateInput();
        }, 2000);
    }
    
    _validateInput () {
      if(this.$.itemId.value) {
        // do something
      }
    }