有时我需要$scope.$apply
在代码中使用它,有时它会引发“已消化的摘要”错误。但是,您可以在评论中(以及在Angular Wiki上)阅读:
如果(!$ scope。$$ phase)$ scope。$ apply()不要这样做,这意味着您的$ scope。$
apply()在调用堆栈中不够高。
所以现在我有两个问题:
另一个防止“已消化摘要”错误的“解决方案”似乎正在使用$ timeout:
$timeout(function() {
//...
});
那是路要走吗?更安全吗?因此,这才是真正的问题:如何 完全 消除“已消化的消化”错误的可能性?
PS:我只在非同步的非angularjs回调中使用$ scope。$ apply。(据我所知,在某些情况下,如果要应用更改,必须使用$ scope。$apply)
经过进一步的挖掘,我能够解决是否始终可以安全使用的问题$scope.$apply
。简短的答案是肯定的。
长答案:
由于您的浏览器执行Javascript的方式,两个摘要调用不可能 偶然 碰撞。
我们编写的JavaScript代码并非一口气运行,而是轮流执行。这些转弯中的每一个从头到尾都是不间断的,当转弯运行时,我们的浏览器中没有其他任何事情发生。(摘自http://jimhoskins.com/2012/12/17/angularjs- and-apply.html)
因此,错误“仅在已经消化的情况下”只能在一种情况下发生:当在另一个$ apply中发出$ apply时,例如:
$scope.apply(function() {
// some code...
$scope.apply(function() { ... });
});
如果* 我们在纯的非angularjs回调中使用$ scope.apply,则 不会 出现这种情况,例如。所以下面的代码是100%防弹有
没有 必要做一个 setTimeout
***if (!$scope.$$phase) $scope.$apply()
setTimeout(function () {
$scope.$apply(function () {
$scope.message = "Timeout called!";
});
}, 2000);
即使这是安全的:
$scope.$apply(function () {
setTimeout(function () {
$scope.$apply(function () {
$scope.message = "Timeout called!";
});
}, 2000);
});
什么是 不是 安全的(因为$超时-像所有angularjs助手-已经呼吁$scope.$apply
你):
$timeout(function () {
$scope.$apply(function () {
$scope.message = "Timeout called!";
});
}, 2000);
这也解释了为什么使用的if (!$scope.$$phase)$scope.$apply()
是反模式。如果使用$scope.$apply
正确的方式,则根本不需要它:例如,在纯js回调中setTimeout
。
阅读http://jimhoskins.com/2012/12/17/angularjs-and-apply.html以获得更详细的说明。
有时我需要在代码中使用,有时它会引发“摘要已经在进行中”错误。因此,我开始寻找解决这个问题的方法,并发现这个问题:AngularJS:prevention error$digest在调用$scope.$apply()时已经在进行。然而,在评论中(以及有棱角的wiki上),您可以读到: 如果(!$scope.$$phase)$scope.$apply(),则不要这样做,这意味着您的$scope.$a
问题内容: 当我通过Angular应用中的websocket接收数据时,我一直在使用它来更新模型的绑定。但是它实际上是做什么的,为什么需要调用它才能完成更新? 问题答案: 从Angular文档: $ apply()用于从角度框架外部以角度执行表达式。(例如,来自浏览器DOM事件,setTimeout,XHR或第三方库)。因为我们正在调用角度框架,所以我们需要执行异常处理的适当范围生命周期,并执行监
问题内容: 我只想知道火热的使用方法。在控制器内,以下代码可以正常工作,并且在3秒后更新DOM: 但是通过使用 没发生什么事… 我以为他们做同样的事情。我怎么了? 问题答案: 并有一些异同。它们的相似之处在于它们都检查了更改内容并更新了UI并触发了所有观察程序。 两者之间的区别是它们的调用方式。被调用而没有任何参数。具有在执行任何更新之前将要执行的功能。 另一个区别是它们的影响。将更新当前范围和任
问题内容: 我试图更好地理解在Angular中使用$ timeout服务作为一种“安全$ apply”方法的细微差别。基本上是在可能响应Angular事件或非Angular事件(例如jQuery或某些标准DOM事件)而运行一段代码的场景中。 据我了解: 在$ scope。$ apply中包装代码适用于您尚未处于摘要循环(又称为jQuery事件)的情况,但是如果正在进行摘要则将引发错误 在$ tim
问题内容: 在AngularJS范围内。在每个事件处理程序(输入指令的keydown / input事件,select指令的change事件等)上调用$ apply()。 看小例子。似乎ngRepeat在每次击键时都会重新计算并重绘,尽管事实是另一个作用域发生了更改。 知道这种决定的理由将是很有趣的。 问题答案: 希望有AngularJS的作者来做,但是我相信$ digest()必须在$ root
问题内容: 我不知道如何使用和。官方文档没有帮助。 我不明白的是: 他们连接到DOM吗? 如何更新对模型的DOM更改? 它们之间的连接点是什么? 我尝试了本教程,但这需要对它的理解并且理所当然。 做什么和做什么,以及如何正确使用它们? 问题答案: 您需要了解AngularJS的工作原理才能理解它。 消化周期和作用域 首先,AngularJS定义了所谓的 摘要循环 的概念。这个周期可以看作是一个循环