代码之家  ›  专栏  ›  技术社区  ›  Woodchuck

为AngularJS$Watch函数设置超时

  •  1
  • Woodchuck  · 技术社区  · 6 年前

    有没有办法为AngularJS$Watch函数添加超时?

    例如,假设我有下面的AngularJS代码在监视一个值, 昵称 . 当值改变时,监听器函数运行。但是如果这个值在一段时间内没有改变,我希望它做些别的事情。

    具体来说,在下面的代码中,我希望$scope.nothingEnteredFlag从false更改为true。设置我的HTML模板以反映该标志的状态(例如,使用ng show)。

    var app = angular.module("helloApp", []);
    app.controller("helloCtrl", function($scope) {
        $scope.nothingEnteredFlag=false;
        $scope.$watch("myName", function (newValue, oldValue) {
            if ($scope.myName.length < 5) {
                $scope.message = "Short name!";
            } else {
                $scope.message = "Long name!";
            }
        });
    });
    

    fiddle .

    我试过在$watch周围加上$timeout,但似乎没法实现。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Just code    6 年前

    你可以用角度 timeout 为了达到你想要的结果。

    var timer;
      var timerFunction = function() {
        timer = $timeout(function() {
          $scope.nothingEnteredFlag = true;
        }, 5000);
      };
    

    这将创建计时器功能

    你的控制器应该这样

    var app = angular.module("helloApp", []);
    app.controller("helloCtrl", function($scope, $timeout) {
      $scope.nothingEnteredFlag = false;
      $scope.myName = "";
      $scope.$watch("myName", function(newValue, oldValue) {
        if ($scope.myName.length < 5) {
          $scope.message = "Short name!";
        } else {
          $scope.message = "Long name!";
        }
        $scope.nothingEnteredFlag = false;
        $timeout.cancel(timer);
        timerFunction();
      });
      var timer;
      var timerFunction = function() {
        timer = $timeout(function() {
          $scope.nothingEnteredFlag = true;
        }, 5000);
      };
      timerFunction();
    });
    

    如您所见,一旦用户输入任何文本,我们将启用5秒的超时。我们将取消计时器并再次启用它。这样,如果用户在5秒钟内没有写入任何内容,我们可以提示他输入。

    Demo