AngularJS GlobalCtrl与$ rootScope vs Service

Gho*_*o5t 18 javascript angularjs

我对Angular中的Globals的一些事情感到困惑.下面是我的伪代码.

1)通过放置GlobalCtrl的方式,我可以从所有控制器中引用我的$ scope.modalOptions.在这种情况下,我很困惑为什么我看到人们将全局属性添加到$ rootScope而不是像我在这里一样添加它们.这是为了以防万一他们想把它注入服务或什么?

2)我应该使用服务而不是向GlobalCtrl添加属性和方法吗?如果是这样,为什么?

<div ng-app="app" ng-controller="GlobalCtrl">
    <div ng-view></div>
</div>
Run Code Online (Sandbox Code Playgroud)

function GlobalCtrl($scope, $location) {
    $scope.modalOptions = {
        backdropFade: true,
        dialogFade: true
    };
}
Run Code Online (Sandbox Code Playgroud)

hol*_*ple 16

"主控制器"方法绝对比使用$ rootScope更可取.

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

了解范围很重要

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

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

建议在这里阅读

最后的想法

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

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