Angularjs 如何检测函数中受影响的数据?

Angularjs 如何检测函数中受影响的数据?,angularjs,Angularjs,我刚做了一个测试,我预计会失败,但它是有效的: 我有20名队员。 每个球员都有很多分数。 我想在输入中显示点数最多的玩家 所以我要做的是迭代集合以找到最好的集合。 所以我绑定了一个迭代集合而不是集合本身的函数,Angular能够知道当集合更新时它必须运行函数,这怎么可能?Angular是否在某个集合更新时重新启动该集合的所有方法,或者是否有智能系统使其能够知道哪些方法受到影响 HTML <input value="{{findTheBest().name}}"> 不,Angular

我刚做了一个测试,我预计会失败,但它是有效的:

我有20名队员。 每个球员都有很多分数。 我想在输入中显示点数最多的玩家

所以我要做的是迭代集合以找到最好的集合。 所以我绑定了一个迭代集合而不是集合本身的函数,Angular能够知道当集合更新时它必须运行函数,这怎么可能?Angular是否在某个集合更新时重新启动该集合的所有方法,或者是否有智能系统使其能够知道哪些方法受到影响

HTML

<input value="{{findTheBest().name}}">

不,Angular在这里做得不太聪明。当Angular$摘要运行时,监视队列将循环通过(在您的情况下,
findTheBest()。name
将在监视队列中)

然后,Angular进行脏检查。因此,它基本上在摘要期间调用两次并比较值。因此,函数将被调用两次,如果值不同,则进行更新


这描述了角度内部正在做什么。

对于每个属性插值:
{{expression}
角度寄存器a
$watch

当发生
$digest
时,angular对所有注册的
$watchers
进行迭代,并根据其范围计算
watchExpressions

当应用程序初始化时,它会使用第一个摘要循环计算表达式,在您的情况下,该表达式也会调用该作用域上的函数。然后,您的函数将注册一个
$timeout

$timeout
默认情况下触发另一个摘要循环,该循环反过来触发另一个$timeout,依此类推


实际上,表达式的求值时间为每个
$digest
,在每个digest循环中可能发生多次。因此,在每个摘要循环中,可以多次调用函数并设置多个
$timeout
,这可能不是您所期望的行为

请在此处阅读更多信息:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, $timeout) {
  $scope.Players = [ { name: 'toto', points: 10 }, { name: 'john', points: 100 } ];
  $scope.findTheBest = function() {
    TheBest = $scope.Players[0];
      for (var Player in $scope.Players) {
        if ($scope.Players[Player].points > TheBest.points)
          TheBest = $scope.Players[Player];
       }

      console.log('The Best = '+TheBest.name);
      return TheBest;
    };

    $timeout(function() {
      $scope.Players[0].points += 500;
    }, 5000);
});