在这两种情况下,我有点困惑,我们使用@Injectable()装饰器标记某些类,以便它们可用于注入到不同的组件。我只想知道@Inject()和构造函数注入之间的正常区别是什么。
方案1-使用@Inject():
@Component({
selector: 'main-app',
template: `
....
{{_service.getName()}}
....
`
})
export class AppComponent{
constructor(@Inject(AppService) private _service){}
....
}
方案2-用作普通参数:
@Component({
selector: 'main-app',
template: `
....
{{_service.getName()}}
`
})
export class AppComponent{
constructor(private _service:AppService){}
....
}
两种情况都可行,有什么区别吗?哪一个更可取?
您实际上只应@Inject
在可注入标记不是类的情况下使用。如果您不了解令牌是什么,那么基本上就是Angular用来识别要注入的内容的东西。例如
providers: [
AuthService,
{ provide: Http, useValue: new CustomHttpImpl() }
]
在这里,我们有两个不同的提供程序,AuthService
和和CustomHttpImpl
。随着AuthService
令牌AuthService
。这意味着我们AuthService
显然使用了AuthService
类型
constructor(private authService: AuthService) {}
使用此构造函数,Angular知道要AuthService
使用token查找AuthService
。
在第二个提供程序中,我们提供,CustomHttpImpl
但这次我们使用令牌Http
。所以我们不能注入CustomHttpImpl
我们需要注入Http
,因为那是令牌
// this will actually be the CustomHttpImpl, not Angular's Http
constructor(private http: Http)
// error: No provider for CustomHttpImpl
constructor(private http: CustomHttpImpl)
因此,您可以由此看出令牌是所有类,这足以使Angular找出如何注入。
但是,假设我们有一个String或要注入的东西的数组。我们不能将其绑定到任何类令牌,因此我们需要创建一个人工令牌
import { OpaqueToken } from '@angular/core';
let numbers = [ 1, 2, 3, 4 ];
let config = '{ "some": "json", "config": "data" }'
const NUMBERS = new OpaqueToken('app.numbers');
const CONFIG = new OpaqueToken('app.config');
现在我们有了要注入的物品的代币。当配置时providers
,我们使用这些标记,而在注入时,我们使用@Inject(TOKEN)
providers: [
{ provide: NUMBERS, useValue: numbers },
{ provide: CONFIG, useValue: config }
]
constructor(@Inject(NUMBERS) numbers: number[], @Inject(CONFIG) config: string)
现在,在Angular 4中,我们应该使用InjectionToken
而不是OpaqueToken
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句