Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.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 AngularJS GlobalCtrl vs$rootScope vs服务_Javascript_Angularjs - Fatal编程技术网

Javascript AngularJS GlobalCtrl vs$rootScope vs服务

Javascript AngularJS GlobalCtrl vs$rootScope vs服务,javascript,angularjs,Javascript,Angularjs,我对一些关于角度的全局的东西感到困惑。下面是我的伪代码 1) 通过放置GlobalCtrl的方式,我可以从所有控制器引用$scope.moda选项。在这种情况下,我不明白为什么人们会将全局属性添加到$rootScope,而不是像我现在这样添加它们。这只是为了防止他们想把它注入服务或其他什么 2) 我应该使用服务而不是向我的GlobalCtrl添加属性和方法吗?若然,原因为何 一般来说,全局变量被认为是不好的做法,因为它们不鼓励封装,使调试困难,并促进臃肿的代码。下面是对全局变量的一个很好的讨

我对一些关于角度的全局的东西感到困惑。下面是我的伪代码

1) 通过放置GlobalCtrl的方式,我可以从所有控制器引用$scope.moda选项。在这种情况下,我不明白为什么人们会将全局属性添加到$rootScope,而不是像我现在这样添加它们。这只是为了防止他们想把它注入服务或其他什么

2) 我应该使用服务而不是向我的GlobalCtrl添加属性和方法吗?若然,原因为何


一般来说,全局变量被认为是不好的做法,因为它们不鼓励封装,使调试困难,并促进臃肿的代码。下面是对全局变量的一个很好的讨论:


一个好的经验法则是将属性和方法添加到尽可能多的本地范围,并使用服务在模块之间共享数据。

与使用$rootScope相比,“主控制器”方法无疑更可取

作用域继承已经存在,为什么不利用它呢。在我看来,这种解决方案在大多数情况下都能很好地工作,也就是说,除非您需要在某个地方有一个并行控制器(这不是Main的子级)。在这种情况下,最好的方法是使用服务并在需要的地方注入它。服务(或者更确切地说是工厂,因为这可能是您将要使用的——请阅读更多关于它们的信息)是单例的,在跨控制器共享数据方面工作得很好

了解作用域很重要 作用域继承实际上是常规的JavaScript继承。您应该倾向于对数据使用对象,因为它们是通过引用传递的

如果您有一个原语,如
$scope.myString='是一个原语数据类型'并尝试覆盖子控制器中的值,则结果将与您预期的不同——它将在子控制器上创建一个新字符串,而不是写入父控制器

建议阅读

最后的想法 如果使用嵌套控制器方法,请不要忘记在子控制器中仍然注入
$scope
(和其他依赖项)。如果不使用它,它可能会工作,但它的速度较慢且难以测试,最后但并非最不重要的一点是,使用错误的方法


最后,如果您有许多状态变量要跟踪和/或许多使用点,那么将它们提取到服务中肯定是个好主意。

我开始回答,但这正是我要说的。这将显示一个类似@finishingmove的并行控制器(其中$rootScope或最好是一个服务会很有用)。事实上,@KevinMeredith在JavaScript中,所有内容都是通过值传递的。但对于对象,该值是一个引用。这就是为什么不能更改被引用对象本身,只能更改其属性。请参阅:
<div ng-app="app" ng-controller="GlobalCtrl">
    <div ng-view></div>
</div>
function GlobalCtrl($scope, $location) {
    $scope.modalOptions = {
        backdropFade: true,
        dialogFade: true
    };
}