基本上我有这个
MyApp = MyApp || {};
MyApp.settings = {
isFooEnabled: false
}
如果我使用rootscope并想检查isFooEnabled
是否必须将rootScope注入我想要检查的任何对象。
这有什么意义?
使用$rootScope.isFooEnabled
而不是使用直接标准javascript MyApp.isFooEnabled
有什么好处?
什么更适合什么?
什么时候应该使用一个而不是另一个?
答案 0 :(得分:0)
$ rootScope是最顶级的范围。一个应用程序只能有一个$ rootScope,它将在应用程序的所有组件之间共享。因此它就像一个全局变量。所有其他$范围都是$ rootScope的子代。
在模块初始化时设置rootScope的变量,然后每个继承的范围都有自己的副本,可以独立设置。
注:
当你使用带有$ rootScope对象的ng-model时,AngularJS会在控制器的特定$范围内更新这些对象,但不会 在全球范围内$ rootScope。
- 醇>
当我们有服务和工厂之类的东西时,$ rootScope不应该用来共享变量。
最后,Angular FAQ在页面底部说明了这一点:"相反,不要创建一种服务,其唯一目的就是存储和返回数据位。"见here。
答案 1 :(得分:0)
实际上,我认为你不应该使用$rootScope
在这种情况下,你应该创建一个单独的服务(或工厂)来存储你的设置,但是,用法和原因是一样的。
简单地存储值,主要原因是一致性。模块和依赖注入是角度的一个重要部分,以确保您编写可测试的代码,并且这些都使用依赖注入,以便可以轻松编写单元测试(可以模拟依赖项)。虽然注入一个简单的对象没有太多明显的好处,但它与访问更复杂的代码的方式一致,并且有很多要说的。在类似的说明中,如果您要升级设置对象以从服务器获取数据(例如,针对特定于环境的设置),您可能需要开始对该功能进行单元测试,这样您无需模块化即可正确执行该功能
还有(坦率的弱)命名空间参数 - 如果您导入的其他库使用window.MyApp
该怎么办?
TL; DR:这是强烈推荐的最佳做法。现在看起来有点笨拙,但从长远来看,你会从中受益。