Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $scope和$rootScope之间的差异_Javascript_Angularjs - Fatal编程技术网

Javascript $scope和$rootScope之间的差异

Javascript $scope和$rootScope之间的差异,javascript,angularjs,Javascript,Angularjs,有人能解释一下$scope和$rootScope之间的区别吗 我想 $scope: 我们可以使用此方法从特定页面获取特定控制器中的ng模型属性 $rootScope 我们可以通过使用它从任何页面获取任何控制器中的所有ng模型属性 这是正确的吗?或者其他什么?$rootScope是全局可用的,无论您在哪个控制器中,而$scope仅对当前控制器及其子控制器可用。每个应用程序至少有一个rootScope,其生命周期与应用程序相同,每个控制器都可以有自己的作用域,这是不能与他人分享的 看看这篇文章:

有人能解释一下$scope和$rootScope之间的区别吗

我想

$scope: 我们可以使用此方法从特定页面获取特定控制器中的ng模型属性


$rootScope 我们可以通过使用它从任何页面获取任何控制器中的所有ng模型属性



这是正确的吗?或者其他什么?

$rootScope
是全局可用的,无论您在哪个控制器中,而
$scope
仅对当前控制器及其子控制器可用。

每个应用程序至少有一个rootScope,其生命周期与应用程序相同,每个控制器都可以有自己的作用域,这是不能与他人分享的

看看这篇文章:

根据Angular的:

每个角度应用程序只有一个根作用域,但可能有多个子作用域。应用程序可以有多个作用域,因为某些指令会创建新的子作用域(请参阅指令文档,了解哪些指令会创建新的作用域)。创建新作用域时,它们将作为其父作用域的子作用域添加。这将创建一个树结构,它与它们所连接的DOM平行

控制器和指令都引用范围,但彼此不引用。这种安排将控制器与指令以及DOM隔离开来。这一点很重要,因为它使控制器的视图不可知,这大大改进了应用程序的测试过程


主要区别在于指定给对象的属性的可用性。分配给
$scope
的属性不能在定义它的控制器之外使用,而分配给
$rootScope
的属性可以在任何地方使用

示例:如果在下面的示例中,将
$rootScope
替换为
$scope
,则不会从第二个控制器中的第一个控制器填充department属性

angular.module('example',[])
.controller('GreetController',['$scope','$rootScope',',
函数($scope,$rootScope){
$scope.name='World';
$rootScope.department='Angular';
}
])
.controller('ListController',['$scope',
职能($范围){
$scope.names=['Igor','Misko','Vojta'];
}
]);

你好{{name}}!
  • {{{name}来自{{department}
  • “$rootScope”是在网页中创建的所有“$scope”角度对象的父对象

    $scope是使用
    ng controller
    创建的,而$rootscope是使用
    ng app
    创建的

    新的样式,比如,建议我们根本不应该使用
    $scope
    来保存当前页面的属性。相反,我们应该使用
    controllerAs with vm
    方法,其中视图绑定到控制器对象本身。然后在使用controllerAs语法时为此使用捕获变量。选择一致的变量名,如vm,它代表ViewModel


    您仍然需要
    $scope
    来实现其监视功能。

    从另一个角度来看;
    $rootScope
    是全局的,而
    $scope
    是本地的。当
    控制器
    被分配给一个页面时,这里可以使用
    $scope
    变量,因为它绑定到这个控制器。但是当我们nt将其值共享给其他控制器或服务,然后使用
    $rootScope
    (*有其他方法,我们可以跨共享值,但在这种情况下,我们希望使用
    $rootScope

    关于如何定义这两个词的第二个问题是正确的


    最后,请小心使用
    $rootScope
    。与您使用全局变量的方式类似,调试时可能会遇到麻烦,您可能会在计时器内的某个位置意外更改全局变量,或者导致读数不正确。

    我建议您阅读有关scopes的官方深入角度文档。从“范围层次结构”部分开始:

    本质上,$rootScope和$scope都标识DOM的特定部分,其中

    • 执行角度操作
    • 声明为$rootScope或$scope一部分的变量可用
    属于$rootScope的任何内容都可以在Angular应用程序中全局使用,而属于$scope的任何内容都可以在应用该范围的DOM部分中使用

    $rootScope应用于DOM元素,该元素是Angular应用程序的根元素(因此名为$rootScope)。将ng app指令添加到DOM元素时,它将成为DOM的根元素,$rootScope在其中可用。换句话说,$rootScope的属性等将在整个应用程序中可用

    角度$scope(及其所有变量和操作)可用于应用程序中DOM的特定子集。具体而言,任何特定控制器的$scope可用于应用该特定控制器的DOM部分(使用ng控制器指令)。请注意,尽管某些指令(如ng repeat)在应用于已应用控制器的DOM的某个部分时,可以在同一控制器内创建主作用域的子作用域,但控制器不一定只包含一个作用域

    如果在运行Angular应用程序时查看生成的HTML,您可以很容易地看到哪些DOM元素“包含”了一个作用域,因为Angular在任何应用了作用域的元素(包括应用程序的根元素,它具有$rootScope)上添加了类ng作用域

    顺便说一句,$scope和$rootScope开头的“$”符号在Angular中只是一个标识符,用于表示正在使用的内容