添加提供程序后,Angular 14 中也会出现 NullInjectorError
代码如下所示
应用程序模块.ts
import { LogService } from './services/log.service';
import { LogType, Config } from './interface/config';
import { loggerServiceFactory } from './logfactory';
export const config = {
apiUrl: 'http://localhost:3000',
logType: LogType.Default
}
providers: [
{provide: LogService, useFactory: loggerServiceFactory, deps:[config]}
],
Run Code Online (Sandbox Code Playgroud)
记录器服务工厂
import { AppConfig, LogType } from "./interface/config";
import { ClientService } from "./services/client.service";
import { LogService } from "./services/log.service";
export const loggerServiceFactory = (config: AppConfig) => {
if(config.logType === LogType.Client) {
return new ClientService();
}
return new LogService();
}
Run Code Online (Sandbox Code Playgroud)
日志服务
import { Injectable } from '@angular/core';
@Injectable()
export class LogService {
protected id = 0;
constructor() {
this.id = Math.random() * 100;
console.log(`LoggerService ${this.id} created`)
}
log(message: string) {
console.log(`LoggerService ${this.id} log: ${message}`);
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序组件.ts
constructor(private log: LogService){
this.log.log('App component constructor');
}
Run Code Online (Sandbox Code Playgroud)
在提供者数组中,您传递的是配置对象而不是依赖项,这就是您收到 NullInjection 错误的原因。
解决方法之一是您可以创建新的注入令牌并使用 useValue 方法传递值,然后将 CONFIG 依赖项传递给 LogService deps
import { InjectionToken, NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';
import { loggerServiceFactory, LogServiceToken } from './logfactory';
import { LogService } from './logservice';
export const config = {
apiUrl: 'http://localhost:3000',
logType: 'log',
};
export const CONFIG = new InjectionToken<typeof config>('CONFIG');
@NgModule({
imports: [BrowserModule, FormsModule],
declarations: [AppComponent, HelloComponent],
providers: [
{ provide: CONFIG, useValue: config },
{
provide: LogService,
useFactory: (config) => {
return loggerServiceFactory(config);
},
deps: [CONFIG],
},
],
bootstrap: [AppComponent],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1905 次 |
| 最近记录: |