angularjs - 为什么 Scope.$apply() 调用 $rootScope.$digest() 而不是 this.$digest()?

标签 angularjs

在 AngularJS 范围内,$apply() 在每个事件处理程序(输入指令的 keydown/input 事件,选择指令的更改事件等)和其他一些情况下被调用。

small example .尽管更改发生在其他范围内,但似乎 ngRepeat 在每次按键时都会重新计算和重绘。

了解这种决定的理由会很有趣。

最佳答案

AngularJS 作者对此会很好,但我相信 $digest() 需要在 $rootScope 上调用,因为在转发器中触发的更改可能会对其他范围(甚至 $rootScope)产生副作用。

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

上面的内容可能听起来有点神秘,所以让我们考虑一个(有点人为的)带有项目列表的示例:

$scope.items = [{name: 'foo', value:0}, {name: 'bar', value:0}, {name: 'baz', value:0}];

现在,让我们使用 ng-Repeat 来显示上面的列表,假设点击一个项目应该增加其他项目的值(再一次,这个例子有点人为,但这里的重点是在一个范围内触发的 Action 可以在其他范围内有副作用)。它可以是这样的:
$scope.incOther = function(item) {
        for (var i=0; i<$scope.items.length; i++){
            if ($scope.items[i] !== item){
                $scope.items[i].value++;
            }
        }
    };

示例函数将修改其他范围和 AngularJS 中的值 - 显示正确的结果 - 需要评估父范围中的观察者(直到 $rootScope 因为我们不知道对象是在哪里定义的)。

这是说明这一点的完整 jsFiddle:http://jsfiddle.net/pkozlowski_opensource/Z6e5g/3/

事实上,上面的 jsFiddle 还在 $rootScope 中包含了一个对象,以说明观察者评估确实需要从最顶部开始。

关于angularjs - 为什么 Scope.$apply() 调用 $rootScope.$digest() 而不是 this.$digest()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12333410/

相关文章:

javascript - 兄弟 Controller 可以在没有父级帮助的情况下相互通信吗 - AngularJS

javascript - 简单的 Angular 单选按钮不起作用......看起来坏了?

angularjs - 使用 yeoman 删除 angularjs 路由

javascript - 未知提供者 : uniqueFilterProvider using unique filter in Angular. js

javascript - 工厂返回数据后未设置 Angular $scope

javascript - Angular.js : How to access nested object literals

javascript - 如何使用 angularjs 通过多重选择传递 JSON 对象

javascript - 检索动态 ng-model 值时出错

javascript - 使用基本 MEAN 示例将 Javascript 文件包含到测试应用程序中的简单错误

javascript - UI 路由器并链接到其他页面上的 anchor 标记?