如何在 Polymer 延迟时正确地将函数范围限定为 运行?
How to properly scope function to run on delay in Polymer?
我正在尝试将输入数据添加到最后一次击键后延迟 2 秒的数组中。但是,当我 运行 时,出现以下错误:Uncaught TypeError: this._validateInput is not a function
我怎样才能正确地将 this._validateInput()
范围延迟到 运行?
我试过 let func = this._validateInput();
,但每次设置 func 时似乎 运行 函数。
此外,on-change 输入处理程序仅在输入失去焦点时触发。
正在寻找解决此问题...
<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);
}
this
关键字始终引用当前作用域的 this
,它会在您将某些内容包装在 function() { ... }
中时发生变化
您需要将外部作用域中的 this
分配给一个变量。
var self = this;
timeout = setTimeout(function () {
self._validateInput();
}, 2000);
参考:setTimeout scope issue
<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
}
}
要么使用 lambda:
setTimeout(
() => this._validateInput(),
2000
);
或绑定函数
setTimeout(this._validateInput.bind(this), 2000);
任一解决方案都应该有效
lambda 起作用是因为它没有自己的作用域。
绑定有效,因为它应用范围 "before" 运行 可以这么说
我正在尝试将输入数据添加到最后一次击键后延迟 2 秒的数组中。但是,当我 运行 时,出现以下错误:Uncaught TypeError: this._validateInput is not a function
我怎样才能正确地将 this._validateInput()
范围延迟到 运行?
我试过 let func = this._validateInput();
,但每次设置 func 时似乎 运行 函数。
此外,on-change 输入处理程序仅在输入失去焦点时触发。
正在寻找解决此问题...
<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);
}
this
关键字始终引用当前作用域的 this
,它会在您将某些内容包装在 function() { ... }
您需要将外部作用域中的 this
分配给一个变量。
var self = this;
timeout = setTimeout(function () {
self._validateInput();
}, 2000);
参考:setTimeout scope issue
<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
}
}
要么使用 lambda:
setTimeout(
() => this._validateInput(),
2000
);
或绑定函数
setTimeout(this._validateInput.bind(this), 2000);
任一解决方案都应该有效
lambda 起作用是因为它没有自己的作用域。 绑定有效,因为它应用范围 "before" 运行 可以这么说