我正在查看Angular documentation for handling forms并找到了一个非常有用的示例,用于在任何字段/控件中捕获更新并延迟。以下是Angularjs提供的示例代码:
<input type="text" ng-model="user.name" ng-model-options="{ debounce: 250 }" /><br />
工作正常。但是他们提到debounce
可以用于多个事件,并提供了另一个例子:
<input type="text" ng-model="user.name" ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }" /><br />
此示例的问题在于,无论您是否离开字段/控件,它总是会延迟更新。在这种情况下,当用户离开字段/控件时,它应该立即更新模型,而debounce
<{1}}时,blur
0 。
Here is link for running example in Plunker.
任何人都可以解释这种行为。
答案 0 :(得分:8)
我相信你是Javascript类型转换的受害者,特别是0
是false
。查看Angular 1.3.0-beta7,18305行的未经授权的来源:
var debounceDelay = ctrl.$options && (isObject(ctrl.$options.debounce)
? (ctrl.$options.debounce[trigger] || ctrl.$options.debounce['default'] || 0)
: ctrl.$options.debounce) || 0;
如果您已指定options.debounce
,则会尝试将debounceDelay
设置为options.debounce.blur
,如您所料。但由于这是0
(false
),因此它会继续... || ...
到ctrl.$options.debounce['default']
,这是非零(true
)并设置此值!
作为一种变通方法,您既可以指定触发默认值的事件的确切名称(是keyup
?),也可以为延迟指定一个小但非零的值,例如: 1:
debounce: { default: 500, blur: 1 }
我认为这应该作为错误提交给Angular。
答案 1 :(得分:0)
在我的情况下,有必要指定updateOn
以及debounce
对象,如下所示:
<textarea
ng-model="$ctrl.notes"
ng-model-options="{ updateOn: 'default blur', debounce: { 'default': 500, 'blur': 0 } }">
</textarea>