我读了这篇article并观看了关于Angular 2中的依赖注入的视频:
并且非常了解Angular中的DI。但我对如何正确使用它感到困惑。
我的问题是何时使用类型定义(1):
import { Component } from '@angular/core';
import { Http } from '@angular/http';
@Component({
selector: 'example-component',
template: '<div>I am a component</div>'
})
class ExampleComponent {
constructor(private http: Http) {}
}
何时使用Injector
(2)这样:
import { Injector, provide } from 'angular2/core'
var injector = Injector.resolveAndCreate(
[
provide(SomeObj, {useClass: SomeObj})
]);
第二个让我感到困惑,因为我不确定它应该去哪里(组件,服务或其他?),如何消费它?
答案 0 :(得分:1)
首先要注意的是resolveAndCreate
方法是ReflectiveInjector
这样的方法(不是Injector
):
import { ReflectiveInjector } from '@angular/core';
const customInjector = ReflectiveInjector.resolveAndCreate( ... )
第二件事是ReflectiveInjector
被弃用,而不是StaticInjector
。在Angular deprecates ReflectiveInjector and introduces StaticInjector. Should you care?
所以现在如果你想创建一个自定义注入器,你应该使用StaticInjector
可以这样做:
import { HttpClient } from '@angular/common/http';
const customInjector = new StaticInjector([
{provide: `MyCustomToken`, useValue: 'just a string value', deps: [HttpClient]}
])
第二个让我困惑,因为我不确定它应该在哪里 去
使用反射或静态注入器创建的自定义注入器可以在实例化时传递给模块或组件工厂。以下是文章Here is what you need to know about dynamic components in Angular中的一些示例:
const customInjector = new StaticInjector( ... );
// module
this.loader.load('app/t.module#TModule').then((klass) => {
const factory = compiler.compileModuleSync(klass);
const module = factory.create(customInjector);
// dynamic component
const r = module.componentFactoryResolver;
const cmpFactory = r.resolveComponentFactory(AComponent);
const componentRef = cmpFactory.create(customInjector);