[英]How to communicate from angular-material2 dialog to its parent
我有打开angular-material2
对话框的Parent
组件。
let dialogRef = this.dialog.open(Child, {
disableClose: true
});
打开的对话框Child
组件有一个按钮“添加”。 如果用户单击“添加”按钮,我想通知“父”组件。
这怎么可能?
我使用EventEmitter
与父容器通信
// dialog component
...
onAdd = new EventEmitter();
onButtonClick() {
this.onAdd.emit();
}
...
和父组件
// parent component
...
let dialogRef = this.dialog.open(Component);
const sub = dialogRef.componentInstance.onAdd.subscribe(() => {
// do something
});
dialogRef.afterClosed().subscribe(() => {
// unsubscribe onAdd
});
...
这是演示
您的答案是正确的,但在 Angular2 材料文档中已经以简单的方式提到了这件事,因为您可以subscribe
dialog Reference
afterClosed
方法(示例中的dialogRef),并且您将从subscribe
方法的参数中获得所选选项的值(在我们的案例结果)。
let dialogRef = this.dialog.open(DialogResultExampleDialog);
dialogRef.afterClosed().subscribe(result => {
this.selectedOption = result;
});
有关更多详细信息,您可以访问此链接https://material.angular.io/components/component/dialog并转到示例选项卡并尝试理解简单示例。
使用 "@angular/material": "~7.0.0" componentInstance
不再存在于 MatBottomSheetRef 上。
它已被instance
替换
父实现:
let dialogRef = this.dialog.open(Component);
const sub = dialogRef.instance.onAdd.subscribe(() => {
// do something
});
如果父项是服务,则您可以通过该服务进行通信。
但是,如果它们都相互引用,您将遇到循环引用问题。 您可以在打开对话框时使用data
参数将“父级”传递给它(我喜欢通过接口执行此操作)。
所以在组件中,当你注入MAT_DIALOG_DATA
你可以将它指定为某个接口。
@Inject(MAT_DIALOG_DATA) public data: IMainMenuDialogData
然后为您传入的任何内容定义它。
export interface IMainMenuDialogData
{
mainMenuService: MainMenuService;
}
在“父”组件中,您通过data
属性将其传入
this.dialogRef.next(this.dialog.open(MainMenuDialogComponent, {
width: '100vw',
height: '100%',
data: <IMainMenuDialogData> { mainMenuService: this } ....
如果你不喜欢传入整个服务,你可以传入特定的 observables、属性或任何你需要的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.