AngularJS中的依赖注入是否仅适用于Angular“Objects”?

时间:2013-10-03 09:49:25

标签: javascript angularjs dependency-injection requirejs

我开始使用AngularJS,而我正试图将注意力集中在依赖注入上。 具体来说,我试图了解DI与使用RequireJS声明依赖关系之间的差异。

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

一般情况下,RequireJS中的依赖关系管理和Angular中的DI之间的区别可以这样说:

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

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

1 个答案:

答案 0 :(得分:9)

  

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

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

  

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

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

  

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

总是一个单身人士,$scope除外。此外,控制器全部被重新实例化(但控制器功能当然仍然是单例)。

  

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

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

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

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

    return MyClass;
});

这也是你可以用RequireJS做的。


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

除此之外,它们看起来与我相似。