繁体   English   中英

Angular JS,将全局数组或对象添加到模块。 推荐与否?

[英]Angular JS, Add Global Array or Object to Module. Recommended or not?

当创建一个Angular模块时,实际上可以向模块添加全局数组或对象。 像这样

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 = {};
});

所以这是问题。 做这样的事情会是个坏主意吗? 文档中是否有建议不要这样做的内容? 如果是这样,您为什么还是不建议不这样做呢?

演示:

http://jsfiddle.net/hrpvkmaj/8/

通常,Angular会竭尽全力避免出现全局状态。 您可以在框架所基于的依赖项注入系统中观察到这一点。 要使用组件,必须将其作为在后台连接的参数注入。 该框架还具有功能强大的作用域确定系统,可以轻松便捷地进行封装。 依赖全局变量对这些系统不利。

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

app.run(function($rootScope)
{
    $rootScope.globalArray = [];
    $rootScope.globalObject = {};
});

从Angular文档中:

每个应用程序都有一个根范围。 所有其他作用域是根作用域的后代作用域。

如果走了这条路线,则可以在需要使用这些全局值的任何地方注入$rootScope

但是,Angular团队不鼓励使用$rootScope

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

还有一种在Angular中定义全局值的方法,甚至比使用$rootScope更可取:定义一个value提供程序。

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

您可以这样定义:

app.value("myValue", {
    someProp: 'Hello World'
});

然后,您可以在任何需要的地方注入值,如下所示:

app.controller("myController", function ($scope, myValue) {
    $scope.someValue = myValue.someProp;
});

这是一个使用值提供者注入全局值的小提琴。

最后,您得到的任何答案(包括此答案)都将包含一定程度的主观性。 有许多方法可以处理全局值,但是Angular提供了一些使用该框架完成此操作的非常方便的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM