Javascript 角度JS,将全局数组或对象添加到模块。推荐还是不推荐?

Javascript 角度JS,将全局数组或对象添加到模块。推荐还是不推荐?,javascript,angularjs,Javascript,Angularjs,创建角度模块时,基本上可以向模块添加全局数组或对象。就这样 var myApp = angular.module('myApp', ['myModule']); myApp.run(function() { }); angular.module('myModule', []) .run(function() { // global to module var thisModule = angular.module('myModule'); thisModule.gl

创建角度模块时,基本上可以向模块添加全局数组或对象。就这样

var myApp = angular.module('myApp', ['myModule']);

myApp.run(function()
{

});

angular.module('myModule', [])
.run(function()
{
    // global to module
    var thisModule = angular.module('myModule');
    thisModule.globalArray = [];
    thisModule.globalObject = {};
});
这就是问题所在。这样做会不会是个坏主意?文档中是否有建议不要这样做的内容?如果是这样的话,你为什么会或不建议不这样做

演示:


一般来说,为了避免全局状态,Angular会竭尽全力。您可以在框架所基于的依赖项注入系统中观察到这一点。要使用组件,必须将其作为幕后连接的参数注入。该框架还具有一个功能强大的范围界定系统,可以方便地进行封装。依赖全局变量对这些系统不利

特别是,完全像您的代码示例那样做是一个坏主意,因为它不是Angular的设计用途。您不应该将自己的属性添加到Angular的模块对象中。至少,您应该注入
$rootScope
对象并向其中添加全局变量

app.run(function($rootScope)
{
    $rootScope.globalArray = [];
    $rootScope.globalObject = {};
});
从角度文档:

每个应用程序都有一个根作用域。所有其他作用域都是根作用域的子作用域

如果您采用这种方法,您可以在需要使用这些全局值的任何地方注入
$rootScope

当然,全局状态很糟糕,您应该谨慎使用$rootScope,就像您(希望)在任何语言中使用全局变量一样。特别是,不要将其用于代码,只用于数据。如果您想在$rootScope上安装一个函数,那么最好将它安装到一个服务中,该服务可以被注入到需要的地方,并且更易于测试

还有另一种以角度定义全局值的方法,比使用
$rootScope
更可取:定义
提供程序

值提供程序是最简单的提供程序类型。它定义了一个可以在整个应用程序中注入的值

您可以这样定义一个:

app.value("myValue", {
    someProp: 'Hello World'
});
app.controller("myController", function ($scope, myValue) {
    $scope.someValue = myValue.someProp;
});
然后,您可以在任何需要的地方注入值,如下所示:

app.value("myValue", {
    someProp: 'Hello World'
});
app.controller("myController", function ($scope, myValue) {
    $scope.someValue = myValue.someProp;
});


最后,你得到的任何答案,包括这一个,都会包含一定程度的主观性。有很多方法可以处理全局值,但是Angular提供了一些非常方便的方法来使用框架来实现这一点。

个人来说,全局声明不应该出现在代码中。而应该使用IIFE模式。。我希望你能读到这篇文章,克里斯在这里指的不是
myApp
全球化,他指的是
thisModule.globalObject
部分。所以生活与此无关。大概他是在问一些类似的问题:将全局单例连接到模块以简单地访问任何地方是否是一个好主意(例如,
thisModule.sessionUser
以访问当前登录的用户)。当然,我可能错了。这正是代码审查主题被搁置的原因——这个问题在上下文中更能说明您想要解决的问题。也就是说,我并没有立即看到很多情况下,这些全局代码不应该只出现在服务、提供商或类似方面。感谢您的回复。向
$rootScope
注入也是一种常见做法。例如,如果您想在何处使用第三方模块。如果该模块被注入到
$rootScope
,您会感到害怕吗?很难说它有多普遍,但它是可以使用的。如果您确定$rootScope是最好的解决方案,那么就使用它。第三方模块如何使用其
$rootScope
与我无关,只要模块完成其工作即可。反对
$rootScope
的建议与项目的可测试性和可维护性有关。好的,我很清楚
rootScope
是在所有模块之间共享的。对吗?对,对
$rootScope
是应用程序(ng应用程序)中所有作用域的祖先。