我在使用Ember.run.debounce时遇到了一些困难。我将第一个承认我可能误会了应该如何使用反跳。
我的问题:
我有一个输入文本框,我想基于输入框中的文本构造一个正则表达式。我在输入助手值字段上设置了一个观察器,但是该观察器在每次输入更改时都会触发。我真正想要的是仅在用户停止输入X时间后才构建正则表达式。
所以这是观察者的样子:
inputTextObservor: function(){
//Build Regular Expression and do other logic
}.observes('inputText')
Run Code Online (Sandbox Code Playgroud)
我认为可行:
我以为我可以使用Ember.run.debounce将正则表达式创建逻辑包装在观察器中,这样可以防止在用户键入内容时创建正则表达式。
inputTextObservor: function(){
Ember.run.debounce(this, function(){
// Build Regular Expression and do other logic
// should only be called if the user stops typing
// for 2000 milliseconds
}, 2000)
}.observes('inputText')
Run Code Online (Sandbox Code Playgroud)
实际发生的情况:
使用上面的设置,debounce中的regexp创建逻辑不会执行2000毫秒(如在debounce调用中设置的),但是每次触发观察者时都会执行一次。因此,例如,如果反跳时间为2000毫秒,并且用户键入“ HelloWorldOfEmber”,但他们每1000毫秒(即,非常慢)键入1个字符,则我希望在反跳后2000毫秒调用一次反跳方法。用户完成键入“ HelloWorldOfEmber”。
实际发生的情况是,在2000毫秒后,将执行debounce调用,并从此开始,每次用户键入字符时都执行。
我用一个非常简单的jsbin重新创建了我的设置。jsbin中的反跳时间设置为2000毫秒。如果您在输入字段中键入内容,您会注意到,在2000毫秒后,您键入的每个字符都会触发一次反跳功能。
问题:
我认为去抖动通常用于阻止函数触发,直到触发该函数的事件停止发生(在设置的时间窗口内)为止,并且应该只触发一次。
我正在使用以下版本:
DEBUG: ------------------------------- ember.js:3911
DEBUG: Ember : 1.6.1 ember.js:3911
DEBUG: Handlebars : 1.3.0 ember.js:3911
DEBUG: jQuery : 1.10.2 ember.js:3911
DEBUG: -------------------------------
Run Code Online (Sandbox Code Playgroud)
谢谢!
debounce方法将检查传递的函数是否与之前发送的函数相同。它对先前发送的方法和当前发送的方法使用“ ===”检查。
创建一个函数并将其分配给变量,然后将该变量传递给debounce方法。
App.IndexController = Ember.Controller.extend({
events: Ember.A(),
createRegExp: function() {
console.info(this.get('inputText'));
this.get('events').pushObject(this.get('inputText'));
},
inputTextObservor: function(){
Ember.run.debounce(this, this.createRegExp, 2000);
}.observes('inputText')
});
Run Code Online (Sandbox Code Playgroud)