在AngularJS中处理第三方工具以及外部'DOM事件时要记住的一件重要事情是使用$scope.$apply()方法操作来启动更改.这很有效,但有时范围本身我已经在通过摘要(基本上是$ apply方法触发)和调用$ apply进行研究将会引发错误.因此,为了解决这个问题,您必须注意$scope.$$phase每当摘要进行时设置为范围的标志.
所以现在,让我们假设您要更改URL并启动:
$scope.$apply(function() {
$location.path('/home');
});
Run Code Online (Sandbox Code Playgroud)
这可以按预期工作,但现在让我们假设$ scope正忙于做这件事.因此,您需要检查$$阶段变量并假设您的更改将被选中:
if($scope.$$phase) {
$location.path('/home');
}
else {
$scope.$apply(function() {
$location.path('/home');
});
}
Run Code Online (Sandbox Code Playgroud)
这就是我一直在做的事情(显然没有代码重复),它似乎100%的工作.我担心的是,当范围处于消化中途时,AngularJS如何解决这一变化?
也许这个例子不够具体.让我们假设一些更大的东西.想象一下,如果你有一个巨大的网页,其中包含大量的绑定,并假设消化将线性地咀嚼页面(我假设它在优先级方面做了类似的事情......在这种情况下,无论是在首先是DOM树)并从上到下更新页面上的绑定.
<div class="binding">{{ binding1 }}</div>
<div class="binding">{{ binding2 }}</div>
<div class="binding">{{ binding3 }}</div>
<div class="binding">{{ binding4 }}</div>
<div class="binding">{{ binding5 }}</div>
<div class="binding">{{ binding6 }}</div>
<div class="binding">{{ binding7 }}</div>
<div class="binding">{{ binding8 }}</div>
Run Code Online (Sandbox Code Playgroud)
让我们假设消化正在进行,并且它位于消化队列中间的某个位置.现在让我们尝试在某处更改页面顶部的绑定值.
if($scope.$$phase) {
$scope.binding1 = 'henry';
}
Run Code Online (Sandbox Code Playgroud)
现在,不知何故,AngularJS会接收更改并正确更新绑定.即使可以认为更改本身在队列中的早期相对于HTML/DOM也是如此.
我的问题是AngularJS如何管理这种潜在的竞争条件?如果binding8更新(因为它在页面下方),我可以稍微舒服一点,但因为binding1也会更新(马上就不需要再次调用$ apply),这让我有点迷茫.这是否意味着在两者之间的某处发送了另一种消化?或者$ scope对象是否比我预期的更神奇?我会假设,这个问题一直是,虽然之前,但由于查不到关于在首位$$相和$范围是有点棘手,那么我猜想,这也可能是一些通过裂缝下跌.
有任何想法吗?
mat*_*4pl 19
关于绑定和竞争条件.$ digest将循环所有观察者,直到没有变化.正如您可以通过向观察者/绑定方法添加日志来观察它,它将至少调用每个绑定/观察者两次以确保没有更改并且所有绑定值都是稳定的.这些只是脏检查,直到每个值都被解析(在2次循环迭代中没有改变).希望有所帮助.
这在AngularJS文档中有解释:http://docs.angularjs.org/api/ng.$rootScope.Scope#$digest
注意:这是matsko要求的评论的复制/粘贴.
| 归档时间: |
|
| 查看次数: |
9799 次 |
| 最近记录: |