Angularjs 为什么Scope.$apply()调用$rootScope.$digest()而不是这个。$digest()?

Angularjs 为什么Scope.$apply()调用$rootScope.$digest()而不是这个。$digest()?,angularjs,Angularjs,在AngularJS作用域中,对每个事件处理程序(输入指令的keydown/input事件、选择指令的change事件等)和其他一些情况调用$apply() 看。似乎ngRepeat在每次按下键时都会重新计算和重新绘制,尽管在另一个作用域中发生了更改 了解这种决定的基本原理是很有意思的。如果有AngularJS的作者在这方面的话会很好,但我认为需要在$rootScope上调用$digest(),因为在中继器中触发的更改可能会在其他范围(甚至$rootScope)中产生副作用 问题是在子作用域中触

在AngularJS作用域中,对每个事件处理程序(输入指令的keydown/input事件、选择指令的change事件等)和其他一些情况调用$apply()

看。似乎ngRepeat在每次按下键时都会重新计算和重新绘制,尽管在另一个作用域中发生了更改


了解这种决定的基本原理是很有意思的。

如果有AngularJS的作者在这方面的话会很好,但我认为需要在$rootScope上调用$digest(),因为在中继器中触发的更改可能会在其他范围(甚至$rootScope)中产生副作用

问题是在子作用域中触发的方法可以影响父作用域中的对象(因为子作用域继承自父作用域)。因此,即使子作用域中定义的函数不能修改父作用域中的对象引用,它们仍然可以修改父作用域中定义的对象中的值

以上听起来可能有点含糊,所以让我们考虑一个(一个人工的)例子,列举一个项目:

$scope.items = [{name: 'foo', value:0}, {name: 'bar', value:0}, {name: 'baz', value:0}];
现在,让我们使用ng Repeat来显示上面的列表,并假设单击一个项应该增加其他项的值(同样,这个示例有点人为,但这里的要点是,在一个范围内触发的操作可能会在其他范围内产生副作用)。它可以是这样的:

$scope.incOther = function(item) {
        for (var i=0; i<$scope.items.length; i++){
            if ($scope.items[i] !== item){
                $scope.items[i].value++;
            }
        }
    };
$scope.incOther=函数(项){

对于(var i=0;iThanks.You完全正确。我忘记了我可以在父范围中更改对象的值,因为我可以使用$parent.obj、$parent.parent.obj等更改整个对象。