1

我是 AngularJS 的新手。我正在考虑使用该$timeout服务。$timeout我已经读过使用JavaScriptsetTimeout函数的原因之一是因为在调用$scope之前不会在 UI 中更新对变量的更改$scope.$apply。虽然就是这个词,但我无法用实际代码确认这一点。我写了以下内容:

索引.html

<div ng-app="myApp">
  <div ng-controller="myController">
    <div>AngularJS Count: {{total1}}</div>
    <br />

    <div>setTimeout Count: {{total2}}</div>
    <br />

    <button ng-click="start()">start</button>
  </div>
</div>

myController.js

var app = angular.module("myApp", []);
function myController($scope, $timeout) {
  $scope.total1 = 0;
  $scope.total2 = 0;

  $scope.isStarted = false;
  $scope.toggle = function() {
    if (!$scope.isStarted) {
      $scope.isStarted = true;

      $timeout(ngUpdate, 1000);      
      setTimeout(jsUpdate, 1000);
    }    
  };  

  function ngUpdate() {
      $scope.total1 = $scope.total1 + 1;
  }

  function jsUpdate() {
      $scope.total2 = $scope.total2 + 1;
  }
}

在此代码示例中,对变量的更改会$scope在 UI 中更新。我试图在代码中查看一个场景,其中通过setTimeout函数进行的更改在调用之前不会更新 UI $scope.$apply。我是不是误会了?或者是对 AngularJS 框架进行了更改,导致原始断言过时。

4

1 回答 1

0

因为,您是setTimeout从 inside调用的$scope.toggle,所以这段代码已经在$digest循环的上下文中执行。因此,无需调用$apply.

$timeout将测试它是否在 a 中$digest,然后仅$apply在需要时调用。这在构建绑定到发生在角度上下文之外的事件的指令时非常有用。

这是需要时的指令场景$timeout

app.directive('myDirective', function() {

    return {
        link: function(scope, element) {

            element.bind('click', function() {

                // $timeout is needed here because the 'click' event is outside angular
            }
        }
    }
});
于 2013-11-17T16:01:07.807 回答