3

我开始使用 AngularJS,我正试图围绕依赖注入。具体来说,我试图了解 DI 和使用 RequireJS 声明依赖项之间的区别。

Angular 中的 DI 是否仅适用于在某些 angular.module 上定义的“对象”(工厂、服务、模型)?例如,我可以依赖一些外部库,比如使用 DI 的 jQuery 吗?

一般来说,RequireJS 中的依赖管理和 Angular 中的 DI 之间的区别可以这样表述:

RequireJS 仅在首次需要时才处理加载依赖项(延迟加载),并确保所有依赖项在执行之前都存在,而 Angular DI 允许在运行时轻松更改依赖项,只要它的接口保持不变?

最后,DI 是否总是传递依赖项的实例?每次都是一个新实例,还是一个单例?它可以传递一个我可以实例化自己的“类”定义吗?例如,如果我需要将选项传递给构造函数怎么办?

4

1 回答 1

9

Angular 中的 DI 是否仅适用于在某些 angular.module 上定义的“对象”(工厂、服务、模型)?

是的。该模块实际上是服务等的包装器。

我可以依赖一些外部库,比如使用 DI 的 jQuery 吗?

是的,我们正在这样做:myModule.constant("jQuery", window.$).

每次都是一个新实例,还是一个单例?

总是一个单例,除了$scope. 此外,控制器总是重新实例化(但控制器功能当然是单例)。

它可以传递一个我可以实例化自己的“类”定义吗?

是的当然。只需从定义函数返回构造函数,例如:(编辑:这必须与factory; usingservice将实例化MyClass并使用实例作为服务值)

factory("Xxx", function(dep1, dep2) {
    function MyClass() {
        ...
    }

    MyClass.prototype.method = function() ...

    return MyClass;
});

这也是你可以用 RequireJS 做的。


至于与 RequireJS 的区别:我可以确定的一件事是 RequireJS 结合了脚本加载器以及 DI 框架(以及优化器)。所以 Require (AMD) 模块与脚本文件有 1-1 的关系。另一方面,Angular 模块和服务与文件没有必要的关系。

除此之外,他们看起来和我很像。

于 2013-10-03T10:11:26.793 回答