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