AngularJS:使用$timeout来消除延迟



当鼠标在。mousemovediv上移动时,。showdiv出现,然后如果鼠标在3秒内没有移动,。showdiv消失。

<div class="mousemove" ng-mousemove="myToggle()" ng-model="loading" ></div>
<div class="show" ng-show="loading"></div>
$scope.myToggle = function() {
    $scope.loading = true; 
    $timeout(
        function() {
            $scope.loading = false;
        }, 
    3000);
}

我已经做了一些事情,但是当我不断移动鼠标在。mousemove DIV上时,。show DIV会闪烁。我该怎么办,我是AngularJS的新手。下面是我的演示:http://embed.plnkr.co/WbhqAQ4JJvOfuCN4tI3I/preview

如果$timeout已经在运行,您可以在重新启动它之前取消它。

var myApp = angular.module('myApp',[]);
myApp.controller('myController', function($scope, $timeout) {
    $scope.myToggle = function() {
      // Check to see if there already is a $scope.loading timer
      if($scope.loading){
        // if there is then use the $timeout.cancel() method
        $timeout.cancel($scope.loading);
      }
      // Initialize the $timeout into the $scope.loading propert
      $scope.loading = $timeout(
        function() {
          $scope.loading = false;
      }, 3000);
    }
});

演示:http://embed.plnkr.co/WbqGbFG9JTVNXJW970l8/preview

您必须在重新启动它之前清除超时,如下所示:

var myApp = angular.module('myApp',[]);
myApp.controller('myController', function($scope, $timeout) {
    $scope.timeout;
    $scope.myToggle = function() {
        $scope.loading = true;
        window.clearTimeout($scope.timeout);
        $scope.timeout = window.setTimeout(function() {
            $scope.$apply(function() {
                $scope.loading = false;
            });
        }, 3000);
    }
});

参见工作活塞

这个plunk有几个问题。

首先,这里没有理由使用ng-model。只要把它设置为一个作用域变量,因为你是在从控制器编辑它。

第二,鼠标移动将连续执行。每次你移动鼠标它都会创建一个新的超时它不会取消旧的超时。这就是它闪烁的原因。调用这个函数并不断地调用$timeout.cancel()$timeout(function() { }, 3000)也是非常低效的。

可以考虑使用mouseenter和mouselleave,并确保取消旧的超时。

<div ng-app="myApp" ng-controller="myController">
  <div class="mousemove" ng-mouseenter="enter()" ng-mouseleave="leave()"></div>
  <div class="show" ng-show="loading"></div>
</div>
Javascript

var myApp = angular.module('myApp',[]);
myApp.controller('myController', function($scope, $timeout) {
  var timeoutCanceller = null;
  $scope.loading = false;
  $scope.enter = function() {
    cancelTimeout();
    $scope.loading = true;
  };
  $scope.leave = function() {
    timeoutCanceller = $timeout(function() {
      $scope.loading = false;
    }, 3000);
  };
  function cancelTimeout() {
    if (timeoutCanceller) $timeout.cancel(timeoutCanceller);
  }
});

这是一个工作演示。

Edit:将这些事件绑定到父容器而不是直接绑定到元素上也是一个好主意。如果那个加载器是一个叠加,打开它可能会意外地调用mouseleave事件。还提供了更多的样式选择。

<div ng-app="myApp" ng-controller="myController">
  <div ng-mouseenter="enter()" ng-mouseleave="leave()">
    <div class="mousemove"></div>
    <div class="show" ng-show="loading"></div>
  </div>
</div>

相关内容

  • 没有找到相关文章

最新更新