[英]AngularJS GlobalCtrl vs $rootScope vs Service
我對Angular中的Globals的一些事感到困惑。 下面是我的偽代碼。
1)通過放置GlobalCtrl的方式,我可以從所有控制器中引用我的$ scope.modalOptions。 在這種情況下,我很困惑為什么我看到人們將全局屬性添加到$ rootScope而不是像我在這里一樣添加它們。 這是為了以防萬一他們想把它注入服務或什么?
2)我應該使用服務而不是向GlobalCtrl添加屬性和方法嗎? 如果是這樣,為什么?
<div ng-app="app" ng-controller="GlobalCtrl">
<div ng-view></div>
</div>
function GlobalCtrl($scope, $location) {
$scope.modalOptions = {
backdropFade: true,
dialogFade: true
};
}
“主控制器”方法絕對比使用$ rootScope更可取。
范圍繼承是存在的,所以為什么不利用它。 在我看來,該解決方案適用於大多數情況,即除非你需要在某個地方有一個並行控制器(那不是Main的孩子)。 在這種情況下,最好的方法是使用服務並在需要的地方注入。 服務(或者更確切地說是工廠,因為你可能正在使用它 - 在這里閱讀更多關於它們的信息 )是單例,並且可以很好地跨控制器共享數據。
范圍繼承是非常常見的JavaScript繼承。 您應該傾向於為數據使用對象 ,因為它們是通過引用傳遞的。
如果你有一個像$scope.myString = 'is of a primitive data type';
在您的父控制器中並嘗試覆蓋子控制器中的值,結果將不是您所期望的 - 它將在子控制器上創建一個新字符串,而不是寫入父控制器。
建議在這里閱讀
如果您正在使用嵌套控制器方法,請不要忘記仍在子控制器中注入$scope
(和其他依賴項)。 它可能沒有,但它更慢,更難以測試,最后但並非最不重要 - 這是錯誤的方法。
最后,如果您有很多狀態變量來跟蹤和/或使用大量的使用點,那么將它們提取到服務中絕對是個好主意。
一般來說,全局變量被認為是不好的做法,因為它們不鼓勵封裝,使調試變得困難,並促進膨脹的代碼。 以下是對全局變量的一個很好的討論: http : //c2.com/cgi/wiki?GlobalVariablesAreBad 。
一個好的經驗法則是將屬性和方法添加到盡可能最本地的范圍,並使用服務在模塊之間共享數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.