我在使用Ember.run.debounce方面遇到了一些困难。我是第一个承认我可能误解应该如何使用去抖动的人。
我的问题:
我有一个输入文本框,我想根据输入框中的文本构造一个正则表达式。我在输入助手值字段上设置了一个观察者,但每次输入更改时都会触发此观察者。我真正想要的是只在用户停止输入X时间的情况下才构建正则表达式。
所以观察者看起来像这样:
inputTextObservor: function(){
//Build Regular Expression and do other logic
}.observes('inputText')
我认为会起作用:
我以为我可以使用Ember.run.debounce将我的正则表达式创建逻辑包装在observor中,这样可以防止在用户输入时创建正则表达式。
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')
实际发生的事情:
使用上面的设置,去抖动内的正则表达式创建逻辑不会执行2000毫秒(如去抖动调用中所设置的),但每次观察者被触发时都会执行一次。因此,例如,如果去抖时间是2000毫秒,并且用户输入" HelloWorldOfEmber",但是他们每1000毫秒键入1个字符(即,非常慢),我会期望调用去抖方法在用户完成键入" HelloWorldOfEmber"。
后2000毫秒实际发生的是,在2000毫秒之后,执行去抖动调用,并且每次用户键入一个字符时都会执行out out。
我用一个非常简单的jsbin重新创建了我的设置。 jsbin中的去抖时间设置为2000毫秒。如果您输入输入字段,您会注意到,在2000毫秒之后,对于您输入的每个字符,debounced函数会被触发一次。
问题:
我认为debounce通常用于阻止函数触发,直到触发函数的事件停止发生(在设定的时间窗口内),并且它应该只触发一次。
我使用以下版本:
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: -------------------------------
谢谢!
答案 0 :(得分:4)
debounce方法将检查传递的函数是否与之前发送的函数相同。它使用' ==='检查发送的上一个方法和当前发送的方法。
Here is the relevant line that does the check.
创建一个函数并将其赋值给变量并将该变量传递给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')
});