我正在使用一个入口组件,该组件需要访问不是在根级别而是在功能模块级别提供的服务。该服务当前在根组件中提供。入口组件无法通过入口组件构造函数中的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。作为一种解决方法,我改为将服务作为输入参数传递给入口组件并以这种方式访问它。但是,这非常麻烦,而且似乎也不是一个好的实现,因为入口组件中的任何嵌套组件也必须将服务传递给它们。
答案 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>