2016-04-15 58 views
0

我刚刚登上一个新的项目,我看到的角的js代码这个模式很多:使用超时和范围应用 - angularjs

_.defer(function() { 
$scope.$apply(); 
}); 

这似乎是我错了,但我不确定为什么。什么是可能的原因,你会等待角度插值完成,然后再调用$ scope。$ apply()?

+0

可能是为了避免错误“摘要已在进行中”。当Angular正在“消化”数据时,可以改变一个变量。所以也许这种改变不能被角度检测到,所以需要“$ apply”。我的2cents – AlainIb

回答

1

$apply()电话$digest()

引擎盖下,$摘要棱角分明的内部循环,以检查是否有绑定的数据已经改变。 大多数情况下,您不需要打电话给自己,因为AngularJS会照顾到这一点。

您需要调用$ apply的唯一情况是当您使用外部库(例如,当您在指令中包装jquery库或者使用异步lib如facebook/twitter时)和angular不可能知道关于DOM的变化。

在这些情况下,您可以将代码包装在$timeout之内。这只是一个安全的方式角度调用$应用时,其准备好,而不是冒着错误'$digest already in progress error'是你直接调用$应用。

$timeout (function() { 
    $scope.update = "something has changed"; 
}); 

这种方式更多的是原生的角度方式,而不是使用下划线库。

有关详细解释,您可以查看this article(有点古老但角度保持不变的核心原则相同)。