我开始使用AngularJS,而我正试图将注意力集中在依赖注入上。 具体来说,我试图了解DI与使用RequireJS声明依赖关系之间的差异。
Angular中的DI是否只适用于某些angular.module上定义的“对象”(工厂,服务,模型)?例如,我可以依赖一些外部库,比如jQuery使用DI吗?
一般情况下,RequireJS中的依赖关系管理和Angular中的DI之间的区别可以这样说:
RequireJS仅在首次需要时加载依赖项(延迟加载)并确保在执行之前存在所有依赖项,而Angular DI允许在运行时轻松更改依赖项,只要它的接口保持不变?
最后,DI总是传递依赖的实例吗?每次都是一个新实例,还是一个单例?它可以通过我可以实例化的“类”定义吗?例如,如果我需要将选项传递给构造函数,该怎么办?
答案 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模块和服务与文件没有必要的关系。
除此之外,它们看起来与我相似。