Angularjs为多个不起作用的事件辩护

时间:2014-05-08 10:05:56

标签: angularjs angularjs-model

我正在查看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.

任何人都可以解释这种行为。

2 个答案:

答案 0 :(得分:8)

我相信你是Javascript类型转换的受害者,特别是0false。查看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,如您所料。但由于这是0false),因此它会继续... || ...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>