Javascript $scope.$root和$rootScope之间有什么区别?
我在控制器中看到$scope有$root,这是什么?它与可以注入控制器中的$rootScope有何不同?Javascript $scope.$root和$rootScope之间有什么区别?,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我在控制器中看到$scope有$root,这是什么?它与可以注入控制器中的$rootScope有何不同?$rootScopevar,它指向所有作用域的父级,并且可以在任何地方注入。所有其他作用域都是$rootScope的子级。它们是通过$rootScope的$new方法创建的,因此每个作用域都继承自$rootScope 在范围定义中的角度源中构造函数: 似乎$root变量只是创建的第一个作用域的的一个占位符-$rootScope 接下来在$new方法中有: $new: function(is
$rootScope
var,它指向所有作用域的父级,并且可以在任何地方注入。所有其他作用域都是$rootScope
的子级。它们是通过$rootScope
的$new
方法创建的,因此每个作用域都继承自$rootScope
在范围定义中的角度源中
构造函数:
似乎$root
变量只是创建的第一个作用域的的一个占位符-$rootScope
接下来在$new
方法中有:
$new: function(isolate) {
...
if (isolate) {
child = new Scope();
child.$root = this.$root;
...
return child;
因此,$rootScope
的每个作用域子级的$root
变量是对$rootScope
的引用。这些子级的所有子级都将获得对$rootScope
在我看来,最好通过依赖项注入使用$rootScope
,因为它是一种明确且更常用的引用$rootScope
的方式,正如前面提到的,$scope.$root
包含对$rootScope
的引用
不幸的是,使用$scope.$root
和使用$rootScope
之间存在差异:
当$scope
为根时,其$root
属性为null
$scope.$root
仅在隔离作用域上分配:
因此,您可能会遇到这样的情况:$scope.$root
为null
。
最好使用$rootScope
而不是…我从来没有访问过$scope.$root
。它可以是在$scope
上定义的任何用户定义的属性。不,它不是用户定义的。您可以在任何控制器的$scope中找到它,并且用户定义的属性永远不应该以“$”开头。我认为$scope.$root就在那里,可以方便地访问模板中的$rootScope变量,而不需要将$rootScope包含到控制器中。@canerbalci在angular 1.4中,允许销毁根范围,使用此选项。$root将在根作用域被销毁后指向null这是您不应直接传递$rootScope
某个位置(例如角度ui模态)的原因之一,但应始终使用子作用域$rootScope.$new()代码>错误<代码>$root
无论如何。@PetrPeller你能解释更多或者告诉我更多信息吗。我想我遇到了一个问题,这个问题是由于$rootScope被注入到modal中引起的。谢谢。@Usagi已经有一段时间了。我建议尽可能少地使用$rootScope
。如果您需要在组件之间共享信息,只需使用服务即可。注入作用域时,始终创建一个子项:$scope.$new()
,以防止出现错误。组件可能会在卸载时尝试$destroy
要清理的范围,或者设置一些内部信息。这就是为什么每个组件都需要自己的$scope
实例。
$new: function(isolate) {
...
if (isolate) {
child = new Scope();
child.$root = this.$root;
...
return child;