我对 Angular 中的全局变量的一些事情感到困惑。下面是我的伪代码。
1) 通过放置 GlobalCtrl 的方式,我可以从所有 Controller 引用 $scope.modalOptions。既然如此,我很困惑为什么我看到人们将全局属性添加到 $rootScope,而不是像我在这里所做的那样添加它们。这是为了以防万一他们想将其注入(inject)到服务或其他东西中吗?
2) 我应该使用服务而不是向 GlobalCtrl 添加属性和方法吗?如果是这样,为什么?
<div ng-app="app" ng-controller="GlobalCtrl">
<div ng-view></div>
</div>
function GlobalCtrl($scope, $location) {
$scope.modalOptions = {
backdropFade: true,
dialogFade: true
};
}
最佳答案
“主 Controller ”方法绝对优于使用 $rootScope。
范围继承是存在的,所以为什么不利用它呢。在我看来,该解决方案适用于大多数情况,即除非您需要在某处有一个并行 Controller (该 Controller 不是 Main 的子 Controller )。在这种情况下,最好的方法是使用服务并在需要的地方注入(inject)它。服务(或者更确切地说是工厂,因为这就是您可能会使用的——阅读有关它们的更多信息 here )是单例,并且可以很好地在 Controller 之间共享数据。
了解范围很重要
作用域继承几乎就是常规的 JavaScript 继承。您应该倾向于使用对象来存储数据,因为它们是通过引用传递的。
如果您的父 Controller 中有一个像 $scope.myString = 'is of a Primitive data type';
这样的原语,并尝试覆盖子 Controller 中的值,结果将不会正如您所期望的那样——它将在子 Controller 上创建一个新字符串,而不是写入父 Controller 。
建议阅读here
最终想法
如果您使用嵌套 Controller 方法,请不要忘记在子 Controller 中注入(inject) $scope
(和其他依赖项)。如果没有,它可能也能工作,但速度较慢且难以测试,最后但并非最不重要的一点是——这样做的方法是错误的。
最后,如果您有很多状态变量需要跟踪和/或很多使用点,那么将它们提取到服务中绝对是个好主意。
关于javascript - AngularJS GlobalCtrl vs $rootScope vs Service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17006054/