微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

$scope和$$阶段的解决方法是否正常运行在AngularJS中?

在处理第三方工具以及AngularJS中的外部DOM事件时,要牢记的一个重要事情是使用$ scope。$ apply()方法操作来启动更改。这很有意思,但是有时候我的范围本身就是通过一个摘要(这基本上是$ apply方法触发的)来调用$ apply,当这样做会引发错误。所以要解决这个问题,你将不得不注意$ scope。$$阶段标志,当消息进行时,它被设置为范围。

所以现在,让我们说你想改变URL,你开火了:

$scope.$apply(function() {
  $location.path('/home');
});

而这正如预期的那样工作,但现在让我们假设$范围正在忙着做它的事情。因此,您检查$$阶段变量,并假设您的更改将被提取

if($scope.$$phase) {
  $location.path('/home');
}
else {
  $scope.$apply(function() {
    $location.path('/home');
  });
}

这是我一直在做的(不是代码重复显然),它似乎在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>

假设消化正在进行,并且它位于消化队列中间附近。现在让我们尝试在页面顶部更改绑定值。

if($scope.$$phase) {
  $scope.binding1 = 'henry';
}

现在,以某种方式,AngularJS可以选择更改并正确更新绑定。即使更改本身可以被认为相对于HTML / DOM在队列中较早发生。

我的问题是,AngularJS如何管理这种潜在的竞争条件?如果binding8更新(因为它低于页面),我可以有点舒服,但是因为binding1也会更新(马上就不需要再次调用$ apply),这让我有点迷茫。这是否意味着另一个消化是在两地之间的某个地方派出的?还是比我期望的$ scope对象更神奇?我会假设这个问题一直是以前的,但是从第一个角度来看,发现$$阶段和$范围有点棘手,那么我假设这也可能是因为这个问题。

有任何想法吗?

关于绑定和竞赛条件。 $ digest将循环所有观察者,直到没有更改。通过将日志添加到观察者/绑定方法可以观察到,它将调用每个绑定/观察器至少两次以确保没有更改,并且所有绑定的值都是稳定的。这些只是脏检查,直到每个值都被解析(在2循环迭代中没有改变)。希望有帮助。

这在AngularJS文档中有所说明:http://docs.angularjs.org/api/ng.$rootScope.Scope#$digest

注意:这是matsko要求的我的评论的复制/粘贴。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐