javascript - AngularJS GlobalCtrl vs $rootScope vs Service

标签 javascript angularjs

我对 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/

相关文章:

javascript - 通过单击内部的链接在两个 <div> 标签之间切换

javascript - 为什么我的对象中的数据没有设置到我的 React 类组件中的 setState

javascript - Bootstrap Multiple - 从服务器设置选定的值

javascript - 选择选项的一个值后 Controller 响应

javascript - 如何将数字从预定义集合转换为加数数组?

javascript - 如何从 JSON 对象获取值

javascript - 415 将 json 传递给 java 时不支持格式

angularjs - 无法理解 "Injector already created, can not register a module!"错误

javascript - 对于 Angular 谷歌地图,我如何删除多段线?

angularjs - 如何保存 Protractor 测试结果