2

我正在查看用于处理表单的 Angular 文档,并找到了一个非常有用的示例,可以延迟捕获任何字段/控件中的更新。以下是 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,在.blur

这是在 Plunker 中运行示例的链接。

谁能解释这种行为。

4

2 回答 2

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,它将尝试将第一个设置debounceDelayoptions.debounce.blur,如您所料。但由于这是0( false),它继续执行... || ...to ctrl.$options.debounce['default'],它是非零 ( true) 并设置此值!

作为一种解决方法,您可以指定触发默认事件的确切名称(是keyup吗?),或者为您的延迟指定一个小但非零的值,例如 1:

debounce: { default: 500, blur: 1 }

我认为这应该作为错误提交给 Angular。

于 2014-05-08T10:54:42.783 回答
0

在我的情况下,有必要updateOndebounce对象一起指定,如下所示:

<textarea
    ng-model="$ctrl.notes"
    ng-model-options="{ updateOn: 'default blur', debounce: { 'default': 500, 'blur': 0 } }">
</textarea>
于 2016-04-01T15:48:13.227 回答