gpt4 book ai didi

angular - @Inject 与构造函数注入(inject)作为 Angular 2 中的普通参数有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 17:29:58 25 4
gpt4 key购买 nike

我对这两种情况有点困惑,我们用 @Injectable() 装饰器标记一些类,以便它们可以注入(inject)到不同的组件中。我只想知道 @Inject()constructor injection 之间有什么区别。

场景 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) token 不是类的情况下使用@Inject。如果你不熟悉 token 是什么,它基本上就是 Angular 用来识别要注入(inject)什么的东西。例如

providers: [
AuthService,
{ provide: Http, useValue: new CustomHttpImpl() }
]

这里我们有两个不同的提供者,AuthServiceCustomHttpImpl。对于 AuthService, token 是 AuthService。这意味着我们注入(inject) AuthService,显然使用 AuthService 类型

constructor(private authService: AuthService) {}

有了这个构造函数,Angular 就知道使用 token AuthService 寻找 AuthService

在第二个提供者中,我们提供了一个CustomHttpImpl,但这次我们使用 token Http。所以我们不能注入(inject) CustomHttpImpl 我们需要注入(inject) Http,因为那是 token

// this will actually be the CustomHttpImpl, not Angular's Http
constructor(private http: Http)

// error: No provider for CustomHttpImpl
constructor(private http: CustomHttpImpl)

所以你可以从这里看出 token 都是类,这足以让 Angular 弄清楚如何注入(inject)。

但是假设我们有一个字符串,或者我们想要注入(inject)的数组。我们不能将其绑定(bind)到任何类 token ,因此我们需要创建一个人工 token

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');

现在我们有了要注入(inject)的项目的 token 。当我们配置 providers 时,我们使用这些 token ,当我们注入(inject)时,我们 @Inject(TOKEN)

providers: [
{ provide: NUMBERS, useValue: numbers },
{ provide: CONFIG, useValue: config }
]

constructor(@Inject(NUMBERS) numbers: number[], @Inject(CONFIG) config: string)

更新

现在,对于 Angular 4,我们应该使用 InjectionToken 而不是 OpaqueToken

关于angular - @Inject 与构造函数注入(inject)作为 Angular 2 中的普通参数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40017679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com