angular - 将服务注入到模块的所有组件中
问题描述
我有一个由一个组件和一堆子组件组成的模块。还有一个专门针对这个模块的服务。
我不确定是否了解满足我需求的注射机制。我想要做的是将服务注入所有子组件。
当我将带有提供程序的服务注入组件时,没关系,但我想在模块级别设置提供程序。
模块
import { NgModule } from '@angular/core';
import { ChangeUserComponent } from './change-user.component';
import { ChangeUserSidebarComponent } from './sidebar/sidebar.component';
import { ChangeUserUserListComponent } from './user-list/user-list.component';
import { ChangeUserService } from './change-user.service';
@NgModule({
declarations: [
ChangeUserComponent,
ChangeUserUserListComponent,
ChangeUserSidebarComponent
],
providers : [
ChangeUserService // <-- when i set that it's not working
],
exports : [
ChangeUserComponent
]
})
export class ChangeUserModule
{
}
子组件
import { Component, OnDestroy, OnInit } from '@angular/core';
import { ChangeUserService } from '../change-user.service';
@Component({
selector : 'change-user-sidebar',
templateUrl: './sidebar.component.html',
styleUrls : ['./sidebar.component.scss'],
//providers: [ ChangeUserService ] // <-- with that the service is correctly injected
})
export class ChangeUserSidebarComponent
{
public activeNode: any;
constructor(
private _changeUserService: ChangeUserService
)
{
}
}
服务
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class ChangeUserService
{
constructor(
private _http: HttpClient
){}
}
当我在组件级别设置 Provider 但我想在模块级别设置它时,服务被正确注入。
编辑:当我在组件级别设置关键字提供程序时:一切正常
何时在模块级别设置关键字提供程序:
错误:未捕获(承诺):NullInjectorError:StaticInjectorError(AppModule)[ChangeUserSidebarComponent -> ChangeUserService]:StaticInjectorError(平台:核心)[ChangeUserSidebarComponent -> ChangeUserService]:NullInjectorError:没有ChangeUserService的提供者!
有没有办法做到这一点 ?我错过了什么吗?
解决方案
嗯,这很有趣。
在组件级别你可以有一个服务注入(所以你可以直接在每个子组件中注入服务,但这不仅麻烦,而且每个组件都会有它的新服务实例)
但是如果你把我锁在一个地牢里,并说无论如何都要这样做,这就是我会做的。我会懒加载那个模块。
解释:
- 我们有两个提供相同服务的模块(AppModule 和 LazyModule)。
- 由于我们的第二个模块是惰性的,Angular 不知道它的存在。.这意味着我们的 LazyModule 的 providers 数组中列出的任何服务都不可用,因为根注入器还不知道 LazyModule ...... 当我们激活路由时,惰性模块将被加载并创建新的注入器。想象一棵注入器树,顶部是根注入器,对于每个惰性模块,都会创建新的子注入器。
- 来自根注入器的所有服务都将添加到子注入器。如果根注入器和子注入器提供相同的服务,Angular 更喜欢来自子注入器的服务实例。所以每个惰性组件都会获取服务的本地实例,而不是根应用程序注入器中的实例。
- 所以 Lazy 将使用它自己的另一个引用,并且应用程序的其余部分将拥有它
推荐阅读
- node.js - 我每次都会生成一个新的 PKCE 挑战,还是可以存储它?
- sql - 每晚 SQL 数据库到 Postgres RDS 实例
- java - 使用 gradle 启动项目时,如何消除错误 Process 'command' finished with non-zero exit value 1?
- android - Jetpack Compose - LazyColumn 进行无限次数的重组
- javascript - 对 GraphQL 的 POST 请求返回 400
- php - php返回重定向功能
- android - 是什么导致 ANR 在主线程上没有长任务?
- sockets - 拦截 tls.Conn 的 Read() 和 Write(),同时保留 tls.Conn 功能
- javascript - 有没有办法让 Material-UI 中的点徽章变大?
- java - 在 Android 中创建带有条件的日期列表