【问题标题】:Does Dependency Injection in AngularJS only work with Angular "Objects"?AngularJS 中的依赖注入是否仅适用于 Angular“对象”?
【发布时间】:2015-11-18 20:12:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: javascript angularjs dependency-injection requirejs


    【解决方案1】:

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

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

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

    是的,我们正在这样做: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 模块和服务与文件没有必要的关系。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多