【发布时间】:2018-02-01 16:08:08
【问题描述】:
我有一个vm.search 变量的手表,它是一个输入元素的 ng 模型。当我输入某些内容时,我想使用 delayedSave 函数将其保存到数据库中,但我不想保存用户输入的所有内容。所以我决定使用 lodash _.debounce 函数,但问题是这个函数在 $scope.$watch 中不能正常工作。 delayedSave 的执行次数与 $scope.$watch 函数一样多。
$scope.$watch('vm.search', nv => {
let savedQuery = _.find(vm.searchQueries, {query: nv});
if (savedQuery) {
vm.currentSearchQuery = savedQuery;
}
let runDebounce = _.debounce(delayedSave, 1000);
runDebounce(nv);
});
我可以将 debounce 设置为$watch 的回调,但我需要执行代码,我写在下面,每次vm.seach 发生变化。
let savedQuery = _.find(vm.searchQueries, {query: nv});
if (savedQuery) {
vm.currentSearchQuery = savedQuery;
}
【问题讨论】:
-
ng-model提供带有观察者的双向数据绑定。然后您的文本字段可以是:<input ng-change="your_save_func()" ...,因此您可以完全删除$watch,只需在控制器中使用您的“保存功能” -
@AlekseySolovey ng-change 和
$scope.$watch一样,我也需要执行第一部分的代码。 -
ng-change用于 DOM,而$watch就像一个$broadcast侦听器,用于检测 JS 代码的变化。这是comparison -
@AlekseySolovey,让我更简洁:
ng-change似乎没有解决问题。 -
考虑走
ng-change路线。延迟对模型的更改是您想要的吗?<input ng-model=".. " ng-model-options="{ debounce: 1000 }" ng-change="save_func()" />你的 ng-change 函数和你的模型在 1 秒后才会更新。
标签: javascript angularjs lodash watch debounce