【问题标题】:How to get DI from "top component" inside child component in Angular?如何从Angular中子组件内的“顶级组件”获取DI?
【发布时间】:2018-02-23 15:48:27
【问题描述】:

From Angular documentation:

创建一个“顶级组件”,作为所有模块的根 成分。将自定义 HttpBackend 提供程序添加到顶部组件的 提供者列表而不是模块的提供者。回想一下 Angular 为每个组件实例创建一个子注入器并填充 带有组件自己的提供程序的注入器。

当该组件的子组件请求 HttpBackend 服务时, Angular 提供本地 HttpBackend 服务,而不是版本 在应用程序根注入器中提供。子组件使 无论其他模块对 HttpBackend 做什么,正确的 http 请求。

确保将模块组件创建为该模块顶部的子级 组件。

如果我们打开Hierarchical Dependency Injectors 文档的源文件,我们可以看到ACarComponentBCarComponentCCarComponent 创建了CarServiceCarService2CarService3 的三个不同实例。

但是,如果我还在模块级别提供了CarService,我如何从父 DI 获取子组件 BCarComponentCarService

【问题讨论】:

  • 但是我怎样才能从子组件中获取父 DI - 你是什么意思?你的用例是什么?你在组件或模块上定义提供者吗?
  • 您要跳过所有中间组件注入器吗?为什么不按照 Suren 的建议在模块级别定义提供程序?
  • @AngularInDepth.com,我学习文档(参见上面的链接),我想知道如何从“顶级组件”而不是模块级别获取单例。
  • 你不能用可用的公共 API 做到这一点

标签: angular dependency-injection hierarchy web-component


【解决方案1】:

如果您不为CCarComponent 提供提供程序,它将尝试从其父组件中获取该提供程序实例,依此类推。

让我们看一个例子。

@Component({
   selector: 'a-car-comp',
   template: '<div><b-car-comp></b-car-comp></div>',
   providers: [CarService]
})
class ACarComponent { 
    constructor(private carService: CarService) {}
}


@Component({
   selector: 'b-car-comp',
   template: '<div><c-car-comp></c-car-comp></div>'
})
class BCarComponent { 
    constructor(private carService: CarService) {}
}

@Component({
   selector: 'c-car-comp',
   template: '<div></div>'
})
class CCarComponent { 
    constructor(private carService: CarService) {}
}

这里我将CarService 的实例注入到A、B 和C Car 组件中。在 B 和 C 组件中,我没有提供自己的 CarService(提供者列表为空),因此它转到他的父组件(在他的模板中使用它)并获得相同的实例。

每个想要一个服务实例的组件首先尝试在它自己的提供者中找到,如果没有找到,则转到上层组件并尝试在那里找到,直到找到根组件(这里upper component是那个在其模板中使用当前组件)。如果在那里也没有找到,Angular 会抛出一个

错误:未找到 YourService 的提供者

【讨论】:

  • 是的,但是我们可以爬到根 DI。但是我们如何才能只为“顶级组件”范围攀升呢?
  • 查看编辑部分。您需要*不向该组件的提供者提供服务
  • 我已编辑我的问题以澄清问题。据我了解,如果我在模块级别有相同的提供者CarService,我将无法在CCarComponent 级别获得DI。
猜你喜欢
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多