2016-04-15 74 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(有點古老但角度保持不變的核心原則相同)。