我的理解是 $rootScope 是某种全局变量,它允许它在控制器之间共享。工厂也可以做同样的事情。那么,为什么不使用工厂呢?什么时候应该使用 $rootScope 什么时候应该使用 factory ,因为它们的用途几乎相同?
3 回答
AngularJS FAQ 已经很好地回答了这个问题:
$rootScope 存在,但可用于作恶
Angular 中的作用域形成一个层次结构,原型继承自树顶部的根作用域。通常可以忽略这一点,因为大多数视图都有自己的控制器,因此也有自己的范围。
有时,您想让某些数据对整个应用程序具有全局性。对于这些,您可以像任何其他范围一样注入 $rootScope 并在其上设置值。由于作用域从根作用域继承,这些值将可用于附加到指令(如 ng-show)的表达式,就像本地 $scope 上的值一样。
当然,全局状态很糟糕,您应该谨慎使用 $rootScope,就像(希望)在任何语言中使用全局变量一样。特别是,不要将其用于代码,仅用于数据。如果您想在 $rootScope 上放置一个函数,最好将它放在一个可以在需要的地方注入并且更容易测试的服务中。
相反,不要创建一个生活中唯一目的是存储和返回数据位的服务。
提供 $rootScope 以查看应用程序中范围的层次结构。如果您有直接修改层次结构的任务(这非常罕见:例如手动修复由 3rd 方库或某些全局事件发射器引起的内存泄漏),则使用 $rootScope。
在所有其他 99% 的情况下,应使用服务。
其他意见可以在这里找到。
如果您想存储一些数据并在路线更改后保留 - 服务(工厂)是最好的解决方案。$rootScope
可以做同样的事情,但它是全球性的,正如你提到的,所以有机会破坏你的数据。$rootScope
当您需要一些全局事件 ( $rootScope.$broadcast
) 时很有用,例如用户登录/注销,但不适用于数据存储。