【问题标题】:When to use $injector in AngularJS何时在 AngularJS 中使用 $injector
【发布时间】:2015-05-26 17:11:41
【问题描述】:

当我在解析 AngularJS 文档时,我想我会发布这个以获得其他意见。

我的具体情况是,我希望使用模块的 run 方法更改可注射的设置。我有几种不同的方法可以访问注射剂,但不确定使用其中一种方法是否有明显的功能优势。还是归结为本质上相同的东西。

比如说我的模块是这样定义的:

var app = angular.module('MyModule', ['some.Third.Party.Module']);

现在考虑第三方模块中有一个工厂需要设置变量。这可以通过执行以下操作来完成:

app.run(['some.Third.Party.Module.Factory', function (theFactory) {
    theFactory.someVariable = 'foo';
}]);

另一种方法是:

app.run(function ($injector) {
    var theFactory = $injector.get('some.Third.Party.Module.Factory');
    theFactory.someVariable = 'foo';
});

一种方法比另一种更好吗?也许我还没有考虑过第三种选择?

【问题讨论】:

    标签: javascript angularjs angularjs-injector


    【解决方案1】:

    您实际上是在使用 Angular 提供的三种不同方法(据我所知)注入依赖项。

    Angular 可以仅通过函数参数的名称来识别依赖项。当您注入 $injector 时,您正在这里执行此操作。

    app.run(function ($injector) { ... });
    

    以上方法可以快速轻松地进行开发,但在缩小代码时可能会遇到问题,因为变量名可以更改。

    对于生产,通常在开发中一个好的做法是使用注释,就像您在 some.Third.Party.Module.Factory 的第二个代码示例中已有的那样。

    app.run(['$injector', function ($injector) { ... }]);
    

    我知道的第三种方式是直接使用$injector。 这对于单元测试很有用,如果您想有条件地切换注入哪个依赖项。 它提供动态注释而不是静态注释。

    【讨论】:

      【解决方案2】:

      我认为有两种情况你需要通过 $injector 获得服务/工厂/任何东西:

      1) 你有循环依赖,但你确定一切都会好起来的。

      2)你需要从“角度世界”的外部获取一些东西。

      更新:@Explosion Pills 提供的案例看起来也很有趣。

      【讨论】:

        【解决方案3】:

        前者实际上是后者的简写,但请记住,如果您缩小代码,直接引用 $injector 会导致问题,因为该变量将被重命名。您的第一次使用是小型化证明。

        我通常会坚持第一种用法,但你 could also use the $inject annotation 喜欢这样:

        var MyController = function($scope, greeter) {
            // ...
        }
        MyController.$inject = ['$scope', 'greeter'];
        someModule.controller('MyController', MyController);
        

        如果您想将属性添加到MyController 的原型并仍将其用作控制器定义,这是有意义的。

        我真的不确定你是否需要直接使用$injector,除非你在做一些非常花哨的事情。

        还要记住runconfig 方法之间的区别。后者允许您使用providers,它允许您配置run 方法中使用的服务(以及何时注入)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-12-02
          • 1970-01-01
          • 1970-01-01
          • 2017-07-17
          • 1970-01-01
          • 2014-10-22
          • 2015-07-06
          相关资源
          最近更新 更多