$rootScope存在,但它可以用于恶
角度范围形成层次结构,原型从树顶部的根范围继承.通常这可以忽略,因为大多数视图都有自己的控制器,因此也是一个范围.
偶尔会有一些数据要让整个应用程序变得全局化.对于这些,您可以注入$rootScope并将其设置为像任何其他范围.由于范围从根范围继承,所以附加到指令的表达式(如ng-show)可用于本地$范围上的值.
当然,全局状态很糟糕,您应该使用$rootScope,就像您希望(希望)使用任何语言的全局变量一样.特别是,不要将其用于代码,只能使用数据.如果你试图在$rootScope上放置一个函数,那么将它放在可以被注入到需要的地方,并且更容易测试的服务总是更好.
相反,不要创建一个唯一的目的在于存储和返回数据位的服务.
$rootScope exists,but it can be used for evil Scopes in Angular form a hierarchy,prototypally inheriting from a root scope at the top of the tree. Usually this can be ignored,since most views have a controller,and therefore a scope,of their own.
非隔离范围是分层的,但大多数开发人员应该使用具有隔离范围的指令. AngularJS范围的等级性质是角度应用程序中许多错误的根源.这是一个我喜欢调用范围渗透的问题,其中范围属性在DOM树中的某个地方被神奇地修改,你不知道为什么.
Angular的默认行为是固有的范围,这使得它诱使一个控制器更新由另一个控制器管理的内容,依此类推.这就是创建源代码之间的意大利面连接.使它很难维护该代码.
Occasionally there are pieces of data that you want to make global to the whole app. For these,you can inject $rootScope and set values on it like any other scope.
不,这不正确. AngularJS允许您定义常量,值和服务.这些是可以注入到路由,控制器和指令中的东西.这就是让您的应用程序在全球范围内访问的方式,如果您想要使您的控制器或指令可测试,您可以如何进行操作.单元测试作者不知道在$rootScope中哪个属性应该在一个指令或控制器所依赖的地方.他们必须假设$rootScope没有突变以提供服务或数据.
Of course,global state sucks and you should use $rootScope sparingly,like you would (hopefully) use with global variables in any language.
问题不是$rootScope,但是人们在做什么呢?许多应用程序将当前用户,认证令牌和会话数据添加到rootScope中.这最终在模板中被大量使用(如果用户登录,则显示X,否则显示Y).问题是HTML不通信范围层次结构.所以当你看到{{user.firstname”user.lastname}}你不知道变量用户来自哪里.第二个问题是子范围可以影响根属性.如前面的例子,如果一个指令做这个scope.user =’bla bla bla’.它没有替换rootScope上的值.它隐藏了它.现在,您在模板中收到一些奇怪的意外事件,您不知道为什么变量用户已经改变了.
Conversely,don’t create a service whose only purpose in life is to store and return bits of data.
Angular的$cacheFactory和$templateCache是仅存在存储数据的服务的示例.我认为作者试图鼓励在Angular模块中使用常量和值,但这不是一个很好的描述.
So My doubt is why $rootScope is not recommended for functions as a global function? Is there any performance issue?
$rootScope是angular.config(..)中唯一可用的范围.在这段时间内,如果这是唯一可以做到的范围,则可以修改范围.例如;您可能需要在应用程序启动之前注入API密钥或Google anayltics变量.
任何范围的功能通常都是一个坏主意.主要是因为范围中的所有内容都在模板中的表达式中消化.功能帐篷隐藏重型作业.当调用函数时,通过阅读HTML可以说明模板的沉重程度.我已经看到了像函数本身执行3级嵌套循环的函数getHeight().每个角度都需要调用这个函数来消化观察者,看看它是否改变了.你应该尽量保持模板的干燥.
无耻的自我推广:
http://www.thinkingmedia.ca/2015/01/learn-how-to-use-scopes-properly-in-angularjs/