1

我有一个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;
}  
4

1 回答 1

2

runDebounce应该重复调用相同的方法以使去抖动工作。由于您runDebounce在每个摘要循环中重新创建函数,因此每次都运行不同的方法。由于没有再次调用该方法,因此去抖动超时过去了,并且delayedSaved调用了被包装的方法。

将去抖动函数的创建runDebounce移出$watch回调:

const runDebounce = _.debounce(delayedSave, 1000);

$scope.$watch('vm.search', nv => {
    const savedQuery = _.find(vm.searchQueries, {query: nv});

    if (savedQuery) {
      vm.currentSearchQuery = savedQuery;
    }

    runDebounce(nv);

});
于 2018-02-01T16:58:44.103 回答