javascript - 使用全局对象避免 Angular 依赖注入(inject)

标签 javascript angularjs dependency-injection global-variables

我继承了一些使用全局对象来存储 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.$ro​​otScope 可以缩小为 a.$rootScope 但不能进一步缩小。带注释的函数应提及 '$rootScope' 字符串一次,但 $rootScope 变量名称可以缩小为 a。如果一个服务在一个函数内多次使用,将会有所改进。

原因有很多why global variables are bad 。其中一些在这种情况下不适用,而另一些则适用。

关于javascript - 使用全局对象避免 Angular 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46244001/

相关文章:

javascript - 让您编辑/操作图像的 API

javascript - jquery中如何提取多维数组?

angularjs - 如何从ng-grid获取单元格值

c# - 在 Web API 中使用处理程序并让 Unity 解析每个请求

java - @Resource注解产生NPE

javascript - 如何在没有 cgi 的情况下从 python 到 JavaScript 获取 float

javascript - 使用 Javascript 设置 ASP 文字文本

javascript - Angular - 从开发者窗口隐藏 Javascript

javascript - 如何从 ionic 弹出窗口中删除不需要的空间

scala - Play 2.4 Scaldi WS 测试