[英]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.