繁体   English   中英

为什么要使用$ rootScope?

[英]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的变量,然后每个继承的作用域将获得自己的副本,该副本可以独立设置。

注意:

  1. 当您将ng-model与$ rootScope对象一起使用时,AngularJS将在控制器的特定$ scope下而不是在全局级别$ rootScope下更新这些对象。

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

最后,Angular FAQ在页面底部这样说:“相反,不要创建其唯一的目的是存储和返回数据的服务。” 这里看

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

为了简单地存储值,主要原因是一致性。 模块和依赖注入是确保您编写可测试代码的重要组成部分,并且所有这些都使用依赖注入,因此可以轻松编写单元测试(可以模拟依赖)。 尽管注入一个简单的对象并不会带来很多明显的好处,但这与访问更复杂的代码的方式是一致的,对此有很多话要说。 与此类似,如果要升级设置对象以从服务器获取数据(例如,针对特定环境的设置),则可能要开始对该功能进行单元测试,而如果不对它进行模块化,则无法真正完成该功能。

还有一个(坦白地说很弱)的命名空间参数-如果导入的另一个库使用window.MyApp怎么办?

TL; DR:强烈建议采用最佳做法。 现在看来似乎有些笨拙,但从长远来看,您会从中受益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM