是否可以从输入组件访问服务

时间:2019-09-16 04:38:26

标签: angular

我正在使用一个入口组件,该组件需要访问不是在根级别而是在功能模块级别提供的服务。该服务当前在根组件中提供。入口组件无法通过入口组件构造函数中的DI访问此服务实例。我也尝试过通过模块中的uint8_t**提供服务,但是也没有运气。当服务不在根注入器级别时,是否可以通过某种方式获得对进入组件中服务实例的访问?

例如功能模块:

providers

import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { Routing_Module } from './routing.module'; // Components import { Feature_Root_Component } from './feature/feature.component'; import { Management_Component } from './feature/management.component'; @NgModule({ declarations: [ Feature_Root_Component, ], entryComponents: [ Management_Component, ], imports: [ CommonModule, ], }) export class Event_Module { } 当前正在提供一项服务。即:

Feature_Root_Component

现在,当我尝试在入口组件构造函数中访问此服务时,出现NullInjectorError。作为一种解决方法,我改为将服务作为输入参数传递给入口组件并以这种方式访问​​它。但是,这非常麻烦,而且似乎也不是一个好的实现,因为入口组件中的任何嵌套组件也必须将服务传递给它们。

1 个答案:

答案 0 :(得分:1)

显然入门组件现在已弃用,但由于我仍在使用 Angular 7,我想我可以回答这个问题。

Angular 对 Entry Component 的定义是 a bit broader than this,但在您的情况下,假设 Entry Component 只是您“通过 JavaScript”动态创建的(而不是在某些组件的模板中静态使用它)。

在 Angular 中,您将使用组件工厂来动态创建组件。这是一个基本示例:

constructor(
  private resolver: ComponentFactoryResolver,
  private injector: Injector,
) {}

ngOnInit() {
  // First you obtain an instance of the Component Factory for your entry component
  const factory = this.resolver.resolveComponentFactory(MyEntryComponent);

  // You then use that factory to instantiate the component
  const layersComponent = factory.create(this.injector) as ComponentRef<MyEntryComponent>;

  // After this you can insert the component into the DOM, or do whatever with it
}

请注意,factory.create() 的唯一必需参数是注入器的实例。 Injector 定义了组件的依赖注入范围,换句话说 - 组件可以访问哪些服务(和其他依赖项)。

在上面的示例中,我使用了创建组件使用的相同注入器。因此,创建组件可用(提供)的任何服务也将在 MyEntryComponent 中可用。我在这里也可以自由使用不同的注入器 - 例如,我可以使用根注入器(在这种情况下,MyEntryComponent 只能访问服务,即 providedIn: 'root')。

现在,典型的 UI 对话框库会将所有这些隐藏起来。不幸的是,如果他们没有为您提供提供 Injector 实例的方法,那么您很可能不走运。例如。 Angular 的 Material Dialog 允许这样做,但快速查看您的 UI Dialog lib 的文档表明没有这样的功能(尽管似乎有计划包含它,不确定是否已实现:https://github.com/NG-ZORRO/ng-zorro-antd/issues/4710)。< /p>