想象一下,没有provideIn的Angular服务,因此仅在某些组件及其子组件中可用。现在,一个这样的组件打开了MatDialog -是否可以在其中注入该服务?
默认情况下,我看到Angular不会将MatDialog组件视为调用方组件的子组件,而且我也看不到任何更改设置的设置。
P.S。这里的服务是有状态的,因此仅将其提供给MyDialogComponent的提供者将创建新的服务,这是不希望的。
答案 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)
如果您没有在根目录中提供服务,则必须在
中提供将其提供给功能部件意味着每次创建该功能部件时,它都会获取该服务的实例。
如果在模块中提供它,则意味着每次创建模块时,都会创建该服务的一个实例,这对于该模块中的每个功能都是通用的。
如果希望将模块实例提供给对话框组件,则可以。如果选择提供的功能,那么您的对话框组件中将具有该服务的新实例(对保持“父”组件的状态没有用)。
我希望它能回答问题,如果没有,请随时寻求更多解释。