当前位置: 首页 > 面试题库 >

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

楮法
2023-03-14
问题内容

在AngularJS范围内。在每个事件处理程序(输入指令的keydown / input事件,select指令的change事件等)上调用$
apply()。

看小例子。似乎ngRepeat在每次击键时都会重新计算并重绘,尽管事实是另一个作用域发生了更改。

知道这种决定的理由将是很有趣的。


问题答案:

希望有AngularJS的作者来做,但是我相信$ digest()必须在$ rootScope上调用,因为转发器中触发的更改可能会在其他范围(甚至$
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++;
            }
        }
    };

示例函数将修改其他作用域中的值,并且AngularJS(以显示正确的结果)需要评估父作用域中的观察者(直到$
rootScope,因为我们不知道在哪里定义对象)。

这是完整的jsFiddle对此进行了说明:http
:
//jsfiddle.net/pkozlowski_opensource/Z6e5g/3/

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



 类似资料:
  • 问题内容: 我只想知道火热的使用方法。在控制器内,以下代码可以正常工作,并且在3秒后更新DOM: 但是通过使用 没发生什么事… 我以为他们做同样的事情。我怎么了? 问题答案: 并有一些异同。它们的相似之处在于它们都检查了更改内容并更新了UI并触发了所有观察程序。 两者之间的区别是它们的调用方式。被调用而没有任何参数。具有在执行任何更新之前将要执行的功能。 另一个区别是它们的影响。将更新当前范围和任

  • 问题内容: 我创建了一个用于显示工具提示的指令: 对应功能: 应用于此: 这是我观点的一部分,由拥有者的控制器处理 为什么必须调用才能将更改应用到,该更改是早先声明和初始化的? 问题答案: 因为附加到事件的回调超出了angular的范围;angular不知道该函数何时运行/结束,因此摘要循环永远不会运行。 调用或告诉angular更新绑定并触发任何手表。

  • 问题内容: 当我通过Angular应用中的websocket接收数据时,我一直在使用它来更新模型的绑定。但是它实际上是做什么的,为什么需要调用它才能完成更新? 问题答案: 从Angular文档: $ apply()用于从角度框架外部以角度执行表达式。(例如,来自浏览器DOM事件,setTimeout,XHR或第三方库)。因为我们正在调用角度框架,所以我们需要执行异常处理的适当范围生命周期,并执行监

  • 有时我需要在代码中使用,有时它会引发“摘要已经在进行中”错误。因此,我开始寻找解决这个问题的方法,并发现这个问题:AngularJS:prevention error$digest在调用$scope.$apply()时已经在进行。然而,在评论中(以及有棱角的wiki上),您可以读到: 如果(!$scope.$$phase)$scope.$apply(),则不要这样做,这意味着您的$scope.$a

  • 有没有人知道如何避免这个错误,或者实现同样的事情,但以不同的方式?

  • 问题内容: 有时我需要在代码中使用它,有时它会引发“已消化的摘要”错误。但是,您可以在评论中(以及在Angular Wiki上)阅读: 如果(!$ scope。$$ phase)$ scope。$ apply()不要这样做,这意味着您的$ scope。$ apply()在调用堆栈中不够高。 所以现在我有两个问题: 为什么这是反模式? 我如何安全地使用$ scope。$ apply? 另一个防止“已