[英]Why would you ever use the $rootScope?
基本上当我有这个
MyApp = MyApp || {};
MyApp.settings = {
isFooEnabled: false
}
如果我使用rootscope并要检查isFooEnabled
,则必须将rootScope注入要执行检查的任何对象中。
这有什么意义?
与使用直接的标准javascript MyApp.isFooEnabled
相比,使用$rootScope.isFooEnabled
有什么优势?
有什么好处呢?
我什么时候应该使用另一个?
$ rootScope是最高级的范围。 一个应用程序只能有一个$ rootScope,它将在该应用程序的所有组件之间共享。 因此,它就像一个全局变量。 所有其他$ scope是$ rootScope的子级。
在模块初始化时,将设置rootScope的变量,然后每个继承的作用域将获得自己的副本,该副本可以独立设置。
注意:
当您将ng-model与$ rootScope对象一起使用时,AngularJS将在控制器的特定$ scope下而不是在全局级别$ rootScope下更新这些对象。
当我们拥有服务和工厂之类的东西时,不应使用$ rootScope共享变量。
最后,Angular FAQ在页面底部这样说:“相反,不要创建其唯一的目的是存储和返回数据的服务。” 从这里看 。
实际上,我认为在这种情况下您不应该使用$rootScope
,应该创建一个单独的服务(或工厂)来存储您的设置,但是用法和原因是相同的。
为了简单地存储值,主要原因是一致性。 模块和依赖注入是确保您编写可测试代码的重要组成部分,并且所有这些都使用依赖注入,因此可以轻松编写单元测试(可以模拟依赖)。 尽管注入一个简单的对象并不会带来很多明显的好处,但这与访问更复杂的代码的方式是一致的,对此有很多话要说。 与此类似,如果要升级设置对象以从服务器获取数据(例如,针对特定环境的设置),则可能要开始对该功能进行单元测试,而如果不对它进行模块化,则无法真正完成该功能。
还有一个(坦白地说很弱)的命名空间参数-如果导入的另一个库使用window.MyApp
怎么办?
TL; DR:强烈建议采用最佳做法。 现在看来似乎有些笨拙,但从长远来看,您会从中受益。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.