你为什么要使用$ rootScope?

时间:2015-08-04 11:13:07

标签: javascript angularjs

Ok so I was reading here

基本上我有这个

MyApp = MyApp || {};

MyApp.settings = {
    isFooEnabled: false
}

如果我使用rootscope并想检查isFooEnabled是否必须将rootScope注入我想要检查的任何对象。

这有什么意义?

使用$rootScope.isFooEnabled而不是使用直接标准javascript MyApp.isFooEnabled有什么好处?

什么更适合什么?

什么时候应该使用一个而不是另一个?

2 个答案:

答案 0 :(得分:0)

$ rootScope是最顶级的范围。一个应用程序只能有一个$ rootScope,它将在应用程序的所有组件之间共享。因此它就像一个全局变量。所有其他$范围都是$ rootScope的子代。

在模块初始化时设置rootScope的变量,然后每个继承的范围都有自己的副本,可以独立设置。

注:

  
      
  1. 当你使用带有$ rootScope对象的ng-model时,AngularJS会在控制器的特定$范围内更新这些对象,但不会   在全球范围内$ rootScope。

  2.   
  3. 当我们有服务和工厂之类的东西时,$ rootScope不应该用来共享变量。

  4.   

最后,Angular FAQ在页面底部说明了这一点:"相反,不要创建一种服务,其唯一目的就是存储和返回数据位。"见here

答案 1 :(得分:0)

实际上,我认为你不应该使用$rootScope在这种情况下,你应该创建一个单独的服务(或工厂)来存储你的设置,但是,用法和原因是一样的。

简单地存储值,主要原因是一致性。模块和依赖注入是角度的一个重要部分,以确保您编写可测试的代码,并且这些都使用依赖注入,以便可以轻松编写单元测试(可以模拟依赖项)。虽然注入一个简单的对象没有太多明显的好处,但它与访问更复杂的代码的方式一致,并且有很多要说的。在类似的说明中,如果您要升级设置对象以从服务器获取数据(例如,针对特定于环境的设置),您可能需要开始对该功能进行单元测试,这样您无需模块化即可正确执行该功能

还有(坦率的弱)命名空间参数 - 如果您导入的其他库使用window.MyApp该怎么办?

TL; DR:这是强烈推荐的最佳做法。现在看起来有点笨拙,但从长远来看,你会从中受益。