在Angular 2中@Inject和构造函数注入作为正常参数有什么区别?
在这两个场景中我有点困惑,我们用@Injectable()decorator标记一些类,以便它们可以被注入到不同的组件中。我只是想知道@Inject()和构造函数注入之间的区别 场景1-使用@Inject():在Angular 2中@Inject和构造函数注入作为正常参数有什么区别?,angular,Angular,在这两个场景中我有点困惑,我们用@Injectable()decorator标记一些类,以便它们可以被注入到不同的组件中。我只是想知道@Inject()和构造函数注入之间的区别 场景1-使用@Inject(): @Component({ selector: 'main-app', template: ` .... {{_service.getName()}} .... ` }) export class AppCompone
@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
查找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了解如何注入
但是假设我们有一个字符串,或者一个数组,我们想要注入一些东西。我们不能将其与任何类令牌绑定,因此我们需要创建一个人工令牌
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)
更新
现在,对于Angular 4,我们应该使用InjectionToken
而不是OpaqueToken
nice的可能副本,我非常感谢您的回复。顺便说一句,在“但是让我们假设我们有一个字符串”之前,我会添加字符串标记的示例(没有OpaqueToken),这样他们就可以看到共谋的问题在哪里。这就引出了你写的关于蛋白石的东西。@peeskillet我有点困惑OpaqueToken
是一个类,InjectionToken
扩展了OpaqueToken
。为什么我要用@Inject
注入这些?@gravidthinks这是两种不相关的东西。您应该发布另一个带有代码示例的问题。如果不看一个例子来说明你的意思,你就很难解释你的理解哪里出了问题。我最近发现,有时使用@Inject实际上更糟糕,而不仅仅是一种替代方法。查看构造函数中的@Inject(type)myVar:type
与myVar:type
相比,前者似乎阻止了方法检查,因此我可以编写myService.serviceFunc()
代码,如果服务上不存在serviceFunc()
,则TypeScript不会抱怨。但是,如果我使用第二种方法,它确实会给我一个错误(应该是这样的),并且不会传输。
providers: [
{ provide: NUMBERS, useValue: numbers },
{ provide: CONFIG, useValue: config }
]
constructor(@Inject(NUMBERS) numbers: number[], @Inject(CONFIG) config: string)