MST

星途 面试题库

面试题:Angular中多级注入器下服务实例的共享问题

在Angular的多级注入器场景下,假设我们有一个根模块和一个子模块,子模块中有一个组件。如果在根模块和子模块的注入器中都注册了同一个服务,请问该组件获取的服务实例是同一个吗?请解释原因,并说明如何确保组件获取的是根模块注入器注册的服务实例。
24.5万 热度难度
前端开发Angular

知识考点

AI 面试

面试题答案

一键面试
  1. 是否为同一个服务实例
    • 该组件获取的服务实例不是同一个。在Angular的多级注入器场景下,子模块注入器会创建自己的服务实例,它会优先使用自己注入器中注册的服务,而不是根模块注入器中的服务。这是因为Angular的注入器查找服务实例时,会从当前组件对应的最近的注入器开始查找,如果找到了就使用该实例,不会继续向上查找根模块的注入器。
  2. 确保获取根模块注入器注册的服务实例的方法
    • 可以使用@SkipSelf()装饰器。在组件的构造函数中,将服务注入参数加上@SkipSelf(),这样组件在查找服务实例时,会跳过自身组件树层级的注入器,直接从父级注入器开始查找,从而获取到根模块注入器注册的服务实例。例如:
    import { Component } from '@angular/core';
    import { MyService } from './my - service';
    import { SkipSelf } from '@angular/core';
    
    @Component({
      selector: 'app - my - component',
      templateUrl: './my - component.html'
    })
    export class MyComponent {
      constructor(@SkipSelf() private myService: MyService) {}
    }