在MatDialog中提供其他提供程序

时间:2019-10-08 10:25:31

标签: angular angular-material

想象一下,没有provideIn的Angular服务,因此仅在某些组件及其子组件中可用。现在,一个这样的组件打开了MatDialog -是否可以在其中注入该服务?

默认情况下,我看到Angular不会将MatDialog组件视为调用方组件的子组件,而且我也看不到任何更改设置的设置。

P.S。这里的服务是有状态的,因此仅将其提供给MyDialogComponent的提供者将创建新的服务,这是不希望的。

2 个答案:

答案 0 :(得分:1)

所有您需要做的就是提供ViewContainerRef所在的dialog.open方法,其中所需的服务实例位于其中。 “ VERY_IMPORTANT_SERVICE”将可用于“ SomeComponent”中的注入。参见下面的代码

@Component({
    selector: 'cmp',
    providers: [ VERY_IMPORTANT_SERVICE ]
})
export class Component {
    constructor(private dialog: MatDialog, private viewContainerRef: ViewContainerRef) {}

    openDialog() {
       this.dialog.open(SomeComponent, {
           viewContainerRef: this.viewContainerRef
       })
    }
}

答案 1 :(得分:0)

如果您没有在根目录中提供服务,则必须在

中提供
  • Angular特征(组件,指令...)
  • Angular模块

将其提供给功能部件意味着每次创建该功能部件时,它都会获取该服务的实例。

如果在模块中提供它,则意味着每次创建模块时,都会创建该服务的一个实例,这对于该模块中的每个功能都是通用的。

如果希望将模块实例提供给对话框组件,则可以。如果选择提供的功能,那么您的对话框组件中将具有该服务的新实例(对保持“父”组件的状态没有用)。

我希望它能回答问题,如果没有,请随时寻求更多解释。