当工厂可以做同样的事情时,为什么要使用$ rootScope在控制器之间共享数据?

时间:2015-12-25 10:07:59

标签: javascript angularjs angularjs-scope angularjs-factory angularjs-rootscope

我的理解是$ rootScope是某种全局变量,允许它跨控制器共享。工厂也可以做同样的事情。那么,为什么不使用工厂呢?什么时候应该使用$ rootScope?何时应该使用工厂,因为它们几乎用于相同的目的?

3 个答案:

答案 0 :(得分:4)

AngularJS常见问题解答已经很好地解答了这个问题here

  

$ rootScope存在,但它可以用于邪恶

     

Angular形式的范围   层次结构,原型继承自顶部的根作用域   那个树。通常这可以忽略,因为大多数视图都有   控制器,因此也是他们自己的范围。

     

偶尔会有一些您想要全局化的数据   整个应用程序。对于这些,您可以注入$ rootScope并设置值   它像任何其他范围。由于范围继承自根范围,   这些值可用于附加的表达式   像ng-show这样的指令就像本地$ scope的值一样。

     

当然,全球状态很糟糕,你应该谨慎使用$ rootScope,   就像你希望用任何语言的全局变量一样。   特别是,不要将它用于代码,只用于数据。如果你很想   把一个函数放在$ rootScope上,把它放在一个几乎总是更好   可以在需要的地方注入,更容易注入的服务   测试

     

相反,不要创建一个生活中唯一目的的服务   存储并返回数据位。

答案 1 :(得分:1)

提供$ rootScope是为了查看应用程序中作用域的层次结构。如果您有直接修改层次结构的任务(这是非常罕见的:例如手动修复由第三方库或某些全局事件发射器引起的内存泄漏),则使用$ rootScope。 在所有其他99%的情况下,应使用服务 可以找到另一个意见here

答案 2 :(得分:1)

如果您想存储一些数据并在路由更改后保留它 - 服务(工厂)是最佳解决方案。 server.upload可以做同样的事情,但正如你所提到的那样,它是全球性的,所以有机会打破你的数据。当您需要一些全局事件($rootScope)时,$rootScope非常有用,例如用户登录/注销,但不适用于数据存储。