调用 _$controller_ 而不是 _$injector_.get('$controller') 有什么区别?

What is the difference between calling _$controller_ instead of _$injector_.get('$controller')?

beforeEach(inject(function (_$controller_, _$injector_) {
  ctrl = _$controller_(...) // 1
  ctrl = _$injector_.get('$controller')(...) // 2
}));

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

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

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

所以这基本上是旧的 "dependency injection vs. factory" 辩论。框架应该提供对测试的依赖,还是测试要求它对框架的依赖?

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

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

ES5 上下文中没有差异。第一个是 Angular 推荐的方法,因为它被他们使用,也在他们的文档和教程中使用。

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

的实例

它对 ES6 有影响,因为当你对箭头函数进行字符串化时,它不会以 "function(..." 开头,所以 Angular 无法在 Angular 1.5 之前解析它。在这种情况下,您需要使用数组表示法:inject(['$controller', $controller => { ... }]).