2016-03-15 69 views
0

我無法理解$ digest是如何工作的。據Angular $scope.$digest vs $scope.$apply

「$摘要(給出的答案)將更新目前的範圍和任何子範圍。$適用()將更新所有的範圍。所以大部分時間$消化()將是你想要什麼,更高效「

但在我plnkr當我做

$rootScope.company = "Google"; 

調用$消化()的第二控制器上,改變被父範圍也將更新。我犯了什麼錯誤嗎?

Plnkr:http://plnkr.co/edit/LTBWTWf7hxlfc5niXsGN?p=preview

回答

0

我給看看你的代碼,我發現它非常有趣! 首先,我建議你玩超時值,例如:我已經將第二個控制器的超時值更改爲1000毫秒,並發現現在兩家公司的'谷歌'在第二和第三那些。

但是除了這個,我已經注意到,在第三控制器您纏繞初始化內部的$適用,使第三控制器的代碼,這

app.controller('ThirdCtrl', function($scope, $rootScope) { 
$scope.name = 'Third'; 

    setTimeout(function() { 
     $scope.name = "I'm Third"; 
    $rootScope.company = "Amazon"; 
    $scope.$digest(); 
    },500); 
}); 

肯定解決了「錯誤」對我來說,由於在第三個控制器中調用的$ apply也正在更新$ rootScope,正常工作! :d

不管怎樣,對於這個解決方案,我也不會你使用$範圍而不是$ rootScope,你可能會遇到不必要的更新,並最終應用程序可能是不穩定的建議。

0
  • $適用於:

是負責通過調用$消化上rootScope($ rootScope執行應用程序所有可用範圍的觀察家的整個列表的功能$消化。 ())

這意味着每次我們調用$ apply()時,我們都會執行應用程序的新生命週期。

  • $摘要:

AngularJS執行週期,這被稱爲$消化$消化負責評估模型和視圖和更新的用戶界面和模型之間的變化同步。

如上所述$ apply在rootScope上調用$摘要,這意味着它重新評估所有可用範圍內的所有觀察者,這可能會導致大範圍層次結構的性能下降。