18

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

2 回答 2

16

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

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

了解范围很重要

范围继承几乎是常规的 JavaScript 继承。您应该倾向于将对象用于数据,因为它们是通过引用传递的。

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

推荐阅读这里

最后的想法

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

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

于 2013-06-09T04:26:54.597 回答
1

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

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

于 2013-06-09T03:38:33.740 回答