调用 _$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 => { ... }])
.
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 => { ... }])
.