为什么我的服务无法正确注入 Angular 中的组件?
Why won't my Service inject properly into a component in Angular?
我的 Angular 应用程序(及相关部分)的结构如下:
app/app.module.ts
import { DbService } from './db.service'
const APP_CONTAINERS = [
DefaultLayoutComponent,
DefaultHeaderComponent,
];
@NgModule({
declarations: [ ...APP_CONTAINERS ],
providers: [ DbService ]
})
export class AppModule {}
app/containers/default-layout.component.ts
import { Component, HostBinding, Inject } from '@angular/core';
import { DbService } from '../../db.service';
import { navItems } from './_nav';
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
@Component({
selector: 'app-dashboard',
templateUrl: './default-layout.component.html'
})
export class DefaultLayoutComponent {
@HostBinding('class.c-app') cAppClass = true;
constructor(private DbService: DbService) {}
async ngOnInit() {
console.log('working')
}
}
我在网站的其他部分成功地使用了相同的服务,但它们都有特定的 module.ts 文件。我按照 Angular 教程进行了操作,但无论我如何尝试注入此服务,我仍然遇到错误。
我也尝试在我的构造函数中使用@Inject,但收到了同样的错误。
我目前在我的控制台中收到以下错误:
ERROR Error: Uncaught (in promise): NullInjectorError: R3InjectorError(e)[e -> e -> e -> e]:
NullInjectorError: No provider for e!
NullInjectorError: R3InjectorError(e)[e -> e -> e -> e]:
NullInjectorError: No provider for e!
I use this same service successfully in other portions of my site but they all have specific module.ts files
所以不清楚你是如何划分你的模块的。从模块文件看,该组件并不在提供服务的模块中。该服务必须位于组件所在的注入树的提供者中。如果该模块文件用于不同的模块,那么注入器必须知道您想要为服务提供什么。
一种解决方案是将其添加到组件的提供程序中。但是,这将获得与其他模块不同的服务实例:
@Component({
selector: 'app-dashboard',
templateUrl: './default-layout.component.html',
providers: [DbService]
})
export class DefaultLayoutComponent {
您也可以将它添加到组件所在模块的提供者中,但这也会得到不同的实例。
我认为最好的方法是定义服务,以便它应该在根模块中提供。这样你就不必在任何地方的提供者中添加它,angular 会在需要时自动将它添加到根模块的提供者中。这就引出了屋大维在他的评论中所说的话。我认为您只是将此代码错误地放在组件而不是服务中。将此移动到服务并从模块中的 providers
数组中删除服务:
@Injectable({
providedIn: 'root'
})
我的 Angular 应用程序(及相关部分)的结构如下:
app/app.module.ts
import { DbService } from './db.service'
const APP_CONTAINERS = [
DefaultLayoutComponent,
DefaultHeaderComponent,
];
@NgModule({
declarations: [ ...APP_CONTAINERS ],
providers: [ DbService ]
})
export class AppModule {}
app/containers/default-layout.component.ts
import { Component, HostBinding, Inject } from '@angular/core';
import { DbService } from '../../db.service';
import { navItems } from './_nav';
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
@Component({
selector: 'app-dashboard',
templateUrl: './default-layout.component.html'
})
export class DefaultLayoutComponent {
@HostBinding('class.c-app') cAppClass = true;
constructor(private DbService: DbService) {}
async ngOnInit() {
console.log('working')
}
}
我在网站的其他部分成功地使用了相同的服务,但它们都有特定的 module.ts 文件。我按照 Angular 教程进行了操作,但无论我如何尝试注入此服务,我仍然遇到错误。
我也尝试在我的构造函数中使用@Inject,但收到了同样的错误。
我目前在我的控制台中收到以下错误:
ERROR Error: Uncaught (in promise): NullInjectorError: R3InjectorError(e)[e -> e -> e -> e]:
NullInjectorError: No provider for e!
NullInjectorError: R3InjectorError(e)[e -> e -> e -> e]:
NullInjectorError: No provider for e!
I use this same service successfully in other portions of my site but they all have specific module.ts files
所以不清楚你是如何划分你的模块的。从模块文件看,该组件并不在提供服务的模块中。该服务必须位于组件所在的注入树的提供者中。如果该模块文件用于不同的模块,那么注入器必须知道您想要为服务提供什么。
一种解决方案是将其添加到组件的提供程序中。但是,这将获得与其他模块不同的服务实例:
@Component({
selector: 'app-dashboard',
templateUrl: './default-layout.component.html',
providers: [DbService]
})
export class DefaultLayoutComponent {
您也可以将它添加到组件所在模块的提供者中,但这也会得到不同的实例。
我认为最好的方法是定义服务,以便它应该在根模块中提供。这样你就不必在任何地方的提供者中添加它,angular 会在需要时自动将它添加到根模块的提供者中。这就引出了屋大维在他的评论中所说的话。我认为您只是将此代码错误地放在组件而不是服务中。将此移动到服务并从模块中的 providers
数组中删除服务:
@Injectable({
providedIn: 'root'
})