【问题标题】:What is the difference between calling _$controller_ instead of _$injector_.get('$controller')?调用 _$controller_ 而不是 _$injector_.get('$controller') 有什么区别?
【发布时间】:2016-04-07 18:45:22
【问题描述】:
beforeEach(inject(function (_$controller_, _$injector_) {
  ctrl = _$controller_(...) // 1
  ctrl = _$injector_.get('$controller')(...) // 2
}));

有什么区别,首选哪种方式?

【问题讨论】:

    标签: angularjs unit-testing jasmine angular-mock


    【解决方案1】:

    在传递给inject()的函数的参数中声明_$controller_会使框架在函数中注入$controller服务。

    调用$injector.get('$controller') 明确向框架请求$controller 服务。

    所以这基本上是旧的“依赖注入与工厂”辩论。框架应该提供对测试的依赖,还是测试应该要求它对框架的依赖?

    第一个在生产代码中绝对是首选:它使您的代码可测试,并且是您应该使用框架的方式。

    在测试中,没有显着差异,虽然我也更喜欢第一个。

    【讨论】:

    • 感谢您的解释!
    • 我们如何在类似的行上获得 $injector.get('$service') ?
    【解决方案2】:

    在 ES5 上下文中没有区别。第一个是 Angular 建议的方式,因为它被他们使用,也在他们的文档和教程中。

    当您将函数传递给inject 时,Angular 会将其字符串化并解析函数参数以确定要注入的提供程序。然后它使用正确的提供者调用该函数。例如,Angular 可能会调用$inject.get 来获取$controller 的实例。

    这对 ES6 有影响,因为当您对箭头函数进行字符串化时,它不会以“function(...”开头,因此 Angular 无法在 Angular 1.5 之前解析它。在这种情况下,您需要使用数组表示法:@ 987654324@.

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 2021-05-10
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多