实现$ scope的延迟.$ watch

Cal*_*ass 20 angularjs

我想知道是否有可能在$ scope上实施一点延迟.$ watch.我有以下查询服务器,所以我想在评估query服务器之前稍微延迟.我注意到如果你快速键入它会混淆并且不会发送正确的信息:

$scope.$watch("query", function () {
    $scope.loading = true;
    returnFactory.query($scope.query).then(function (returns) {
        $scope.returns = returns;
        $scope.loading = false;
    });
});
Run Code Online (Sandbox Code Playgroud)

Kon*_*ass 34

通常情况下我会说这个延迟使用angular的$ timeout,但你还是不能清除这个超时.

//编辑:你可以.

如果此观察者被快速触发,则设置超时并清除它.

像这样:

var timeoutCode;
var delayInMs = 2000;
$scope.$watch("query", function(query) {
 clearTimeout(timeoutCode);  //does nothing, if timeout alrdy done
 timeoutCode = setTimeout(function(){   //Set timeout
     $scope.loading = true;
     returnFactory.query(query).then(function(returns) {
       $scope.returns = returns;
       $scope.loading = false;
     });
 },delayInMs);
});
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/4FuyY/

更新感谢stewie这可以通过angular的$ timeout来实现.

    var timeoutPromise;
    var delayInMs = 2000;
    $scope.$watch("query", function(query) {
     $timeout.cancel(timeoutPromise);  //does nothing, if timeout alrdy done
     timeoutPromise = $timeout(function(){   //Set timeout
         $scope.loading = true;
         returnFactory.query(query).then(function (returns) {
           $scope.returns = returns;
           $scope.loading = false;
         });
     },delayInMs);
    });
Run Code Online (Sandbox Code Playgroud)

  • `$ timeout`**可以用`$ timeout.cancel(timeoutPromise)`清除. (7认同)

Ism*_*a90 12

你可以使用ng-model-option,如果模型'query'是Html标签或Angular指令,对于Ej:

<input type ng-model="query" ng-model-options="{ updateOn: 'default blur', debounce: { 'default':
 2000, 'blur': 1 } }" />
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到Angular Doc:https://docs.angularjs.org/api/ng/directive/ngModelOptions

  • 此答案必须标记为已更正. (2认同)

Bri*_*sio 7

我喜欢使用Lo-Dash,它提供了两个非常有用的功能:debouncethrottle,它可以完全满足您的需求.假设你想确保它每150毫秒只调用一次函数:

function update() {
 $scope.loading = true;
    returnFactory.query($scope.query).then(function (returns) {
        $scope.returns = returns;
        $scope.loading = false;
    });
}

$scope.$watch("query", function () {
   _.throttle(update, 150);
});
Run Code Online (Sandbox Code Playgroud)

throttle功能可让您控制何时update调用函数(尾随或前沿).

我在我的应用程序中一直使用Lo-Dash.它对我来说是一个必备的库...比jQuery更有用.但是,如果您不想包含整个库,则可以创建Lo-Dash的自定义构建,其中仅包含throttledebounce函数.

  • Lodash很棒,是任何项目的必备品,但值得注意的是,使用lodash的'debounce`可以防止单元测试.如果你需要单元测试,你可能想要考虑基于`$ timeout`的去抖动实现,因为angular-mocks提供`$ timeout.flush()` (2认同)