Angular 将服务注入模块的所有组件中

Angular 将服务注入模块的所有组件中,angular,typescript,Angular,Typescript,我有一个由一个组件和一堆子组件组成的模块。还有一项专门用于此模块的服务 我不确定是否理解我需要的注射方法。 我想做的是将服务注入到所有子组件中 当我向组件中注入带有提供者的服务时,这是可以的,但我想在模块级设置提供者 模块 import { NgModule } from '@angular/core'; import { ChangeUserComponent } from './change-user.component'; import { ChangeUserSidebarCompon

我有一个由一个组件和一堆子组件组成的模块。还有一项专门用于此模块的服务

我不确定是否理解我需要的注射方法。 我想做的是将服务注入到所有子组件中

当我向组件中注入带有提供者的服务时,这是可以的,但我想在模块级设置提供者

模块

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 { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class ChangeUserService 
{
    constructor(
        private _http: HttpClient
    ){}
}
当我在组件级别设置提供者时,服务被正确注入,但我想在模块级别设置它

编辑:当我在组件级别设置关键字提供程序时:一切正常

在模块级设置关键字提供程序时:

错误:未捕获(承诺中):NullInjectorError:StaticInjectorError(AppModule)[ChangeUserSidebarComponent->ChangeUserService]: StaticInjectorError(平台:核心)[ChangeUserSidebarComponent->ChangeUserService]: NullInjectorError:ChangeUserService没有提供程序


有办法吗?我遗漏了什么吗?

嗯,这很有趣

在组件级别,您可以注入服务(因此您可以直接在每个子组件中注入服务,但这不仅会很麻烦,而且每个组件都会有其新的服务实例)

但是如果你把我关在一个地牢里,并说无论如何我都会这么做。我将延迟加载该模块

说明:

  • 我们有两个模块(AppModule和LazyModule)提供相同的服务
  • 由于我们的第二个模块是惰性的,Angular不知道它的存在。这意味着LazyModule的providers数组中列出的任何服务都不可用,因为根注入器不知道LazyModule。。。然而当我们激活路由时,将加载延迟模块并创建新的注入器。想象一棵注入器树,顶部是根注入器,对于每个延迟模块,将创建新的子注入器
  • 根注入器的所有服务都将添加到子注入器。如果根注入器和子注入器提供相同的服务,Angular将首选子注入器的服务实例。因此,每个惰性组件都会获得服务的本地实例,而不是根应用程序注入器中的实例
  • 因此,懒惰者将使用自己的另一个引用,而应用程序的其余部分将拥有它

  • 嗯,这很有趣

    在组件级别,您可以注入服务(因此您可以直接在每个子组件中注入服务,但这不仅会很麻烦,而且每个组件都会有其新的服务实例)

    但是如果你把我关在一个地牢里,并说无论如何我都会这么做。我将延迟加载该模块

    说明:

  • 我们有两个模块(AppModule和LazyModule)提供相同的服务
  • 由于我们的第二个模块是惰性的,Angular不知道它的存在。这意味着LazyModule的providers数组中列出的任何服务都不可用,因为根注入器不知道LazyModule。。。然而当我们激活路由时,将加载延迟模块并创建新的注入器。想象一棵注入器树,顶部是根注入器,对于每个延迟模块,将创建新的子注入器
  • 根注入器的所有服务都将添加到子注入器。如果根注入器和子注入器提供相同的服务,Angular将首选子注入器的服务实例。因此,每个惰性组件都会获得服务的本地实例,而不是根应用程序注入器中的实例
  • 因此,懒惰者将使用自己的另一个引用,而应用程序的其余部分将拥有它

  • 我不会把任何人关在地牢里做那件事;-)

    最后,我决定遵循第一个解决方案,将服务注入根目录。不想做一些复杂的事情来避免一些可能/不应该发生的事情(即:将服务使用到另一个组件中,而不是专门用于此服务的组件中)

    最初我真正想做的是将服务范围仅限于它的模块,并将其提供给模块的子组件

    将服务放在根目录下,允许我共享该服务,我将假设该服务不应由应用程序的其他部分使用


    无论如何,我仍然不知道为什么将服务设置到模块中在我的环境中不起作用。

    我不会把任何人锁在地牢里这样做;-)

    最后,我决定遵循第一个解决方案,将服务注入根目录。不想做一些复杂的事情来避免一些可能/不应该发生的事情(即:将服务使用到另一个组件中,而不是专门用于此服务的组件中)

    最初我真正想做的是将服务范围仅限于它的模块,并将其提供给模块的子组件

    将服务放在根目录下,允许我共享该服务,我将假设该服务不应由应用程序的其他部分使用


    无论如何,我仍然不知道为什么将服务设置到模块中在我的上下文中不起作用。

    有问题吗?您的模块片段是正确的,这就是您在整个应用程序上注册单例提供者的方式。如果您得到一个错误,您必须向我们显示一个特定的错误。注入是在构造函数中完成的,而不是在提供程序部分。它应该能按你的要求工作。错误是什么?是的,当我在模块级设置provider时,编译器yell,我已经编辑了这个问题。我不想为整个应用程序注册它(根目录中提供的可注入?),而只是为模块和该模块导入的所有组件注册(在示例ChangeUserComponent、ChangeUserListComponent和ChangeUserSidebarComponent中). 目标是只在模块级别注册服务,以便所有导入的组件都不设置关键字pr
    import { Injectable } from '@angular/core';
    import { HttpClient } from '@angular/common/http';
    
    @Injectable()
    export class ChangeUserService 
    {
        constructor(
            private _http: HttpClient
        ){}
    }