AngularJS GlobalCtrl与$ rootScope vs Service

时间:2013-06-09 03:12:26

标签: javascript angularjs

我对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
    };
}

2 个答案:

答案 0 :(得分:16)

“主控制器”方法绝对比使用$ rootScope更好。

范围继承存在,所以为什么不利用它。在我看来,这个解决方案适用于大多数情况,即除非你需要在某个地方有一个并行控制器(那不是Main的孩子)。在这种情况下,最好的方法是使用服务并在需要的地方注入。服务(或者更确切地说是工厂,因为你可能正在使用它 - 阅读更多关于它们的here)是单例,并且可以很好地跨控制器共享数据。

了解范围很重要

范围继承是非常常见的JavaScript继承。您应该倾向于使用对象作为数据,因为它们是通过引用传递的。

如果您的父控制器中有一个类似$scope.myString = 'is of a primitive data type';的原语,并尝试覆盖子控制器中的值,结果将不是您所期望的 - 它将在该控制器上创建一个新字符串子控制器而不是写入父级。

建议阅读here

最后的想法

如果您使用嵌套控制器方法,请不要忘记仍然在子控制器中注入$scope(和其他依赖项)。它可能没有,但它的速度较慢且难以测试,最后但并非最不重要 - 这是错误的方法。

最后,如果您有很多状态变量来跟踪和/或使用大量的使用点,那么将它们提取到服务中绝对是一个好主意。

答案 1 :(得分:1)

一般来说,全局变量被认为是不好的做法,因为它们不鼓励封装,使调试变得困难,并促进膨胀的代码。以下是对全局变量的一个很好的讨论:http://c2.com/cgi/wiki?GlobalVariablesAreBad

一个好的经验法则是将属性和方法添加到尽可能最本地的范围,并使用服务在模块之间共享数据。