在Angular中,当你使用InjectionToken
时,如果没有提供相应的InjectionToken
,就会抛出没有提供InjectionToken
的错误。这通常发生在以下几种情况下:
没有在模块的providers
数组中提供InjectionToken
:
import { InjectionToken } from '@angular/core';
// 创建一个InjectionToken
export const MY_TOKEN = new InjectionToken('myToken');
@NgModule({
// 没有在providers中提供MY_TOKEN
providers: [],
...
})
export class AppModule { }
解决方法是在模块的providers
数组中提供InjectionToken
:
import { InjectionToken } from '@angular/core';
export const MY_TOKEN = new InjectionToken('myToken');
@NgModule({
providers: [
// 提供MY_TOKEN
{ provide: MY_TOKEN, useValue: 'myValue' },
],
...
})
export class AppModule { }
在组件或服务的构造函数中使用InjectionToken
,但没有提供相应的InjectionToken
:
import { Component, Inject } from '@angular/core';
import { MY_TOKEN } from './app.module';
@Component({
selector: 'app-my-component',
template: '...',
})
export class MyComponent {
// 在构造函数中使用MY_TOKEN但没有提供
constructor(@Inject(MY_TOKEN) private myValue: string) { }
}
解决方法是在提供InjectionToken
的模块中提供相应的值:
import { Component, Inject } from '@angular/core';
import { MY_TOKEN } from './app.module';
@Component({
selector: 'app-my-component',
template: '...',
})
export class MyComponent {
constructor(@Inject(MY_TOKEN) private myValue: string) { }
}
@NgModule({
providers: [
{ provide: MY_TOKEN, useValue: 'myValue' },
],
...
})
export class AppModule { }
请注意,InjectionToken
可用于解决依赖注入中的循环依赖问题以及在编译时进行类型检查。确保在使用InjectionToken
时遵循上述解决方法,以避免抛出没有提供InjectionToken
的错误。