我继承了一些使用全局对象来存储 Angular 服务的代码。这些服务附加到 Angular 模块的 run 函数中的全局对象。我的问题是,这会导致以后出现麻烦吗?这会给测试带来什么样的麻烦?像这样传递服务似乎比在每个 Controller 中注入(inject)所有服务要容易得多,所以我明白为什么要这样做。不这样做的其他理由是什么?下面是一些代码来说明我正在谈论的内容:
// vars
var globalObject =
{
ng: {},
};
// Setup module
var myModule = angular.module("myModule", []);
myModule.config(doStuff);
myModule.run(setUpGlobals);
// Setup app globals
function setUpGlobals(ngRootScope, ngHttp, ngTimeout)
{
globalObject.rootScope = ngRootScope;
// angular services
globalObject.ng.http = ngHttp;
globalObject.ng.Timeout = ngTimeout;
}
setUpGlobals.$inject = ['$rootScope', '$http', '$timeout'];
最佳答案
Angular 中引入模块和 DI 正是为了避免依赖全局变量并提高模块化程度。
这是一种幼稚的方法,仅在存在单个模块和单个应用程序实例时才有效。如果有多个模块可以单独使用(包括测试),则会失败。如果页面上有多个应用程序实例(例如,如果 Angular 用于非 SPA 应用程序),则会产生严重的错误。
整体模块会损害可测试性。即使这样使用,有些选项也将不可用,例如在 $controller(...)
中注入(inject) spy 或 stub 服务 - 因为 Controller 依赖于全局变量。
setUpGlobals
导致急切服务实例化。对于核心服务来说,这可能不是问题,但对于现在不需要实例化的服务来说,这将是一个问题。
不太重要的问题是缩小应用程序中的代码大小。 ng.$rootScope
可以缩小为 a.$rootScope
但不能进一步缩小。带注释的函数应提及 '$rootScope'
字符串一次,但 $rootScope
变量名称可以缩小为 a
。如果一个服务在一个函数内多次使用,将会有所改进。
原因有很多why global variables are bad 。其中一些在这种情况下不适用,而另一些则适用。
关于javascript - 使用全局对象避免 Angular 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46244001/