Данные диалога, предоставляемые диалогу через объект MatDialogConfig при открытии диалога, обычно являются копией «оригинальных» данных.Таким образом, изменения, сделанные в диалоге, ограничиваются только диалогом.Стандартный способ использовать MatDialog для изменения «исходных» данных - через функции MatDialogRef close()
и afterClosed()
.
close()
вызываться с измененными данными диалога.Вы можете передать все, что захотите, но обычно вы передаете объект данных, который вы ввели в класс диалога, или какую-то его часть: на
this.dialogRef.close(this.data);
afterClosed()
следует подписаться, чтобы обработчик вызывался, когдадиалог закрыт.Обработчик получает данные, переданные в close()
, а затем обычно использует их для обновления «исходных» данных:
dialogRef.afterClosed().subscribe(result => {
// do something with the result
});
Обработчик будет срабатывать только при вызове close()
.Обычно в вашем диалоге для этого есть кнопка закрытия.Нажатие вне диалогового окна или нажатие клавиши escape не является действием «закрыть» (это действие «отменить»), поэтому обработчик не будет (и не должен) вызываться.
Ваш код не выполняетлюбой из этого.У вас есть функция, которая закрывает диалог, но она передает значение 'true', а не данные диалога, и в любом случае она нигде не вызывается, поскольку вы не реализовали обработчик для закрытия диалога.
Комуисправить это, выполнив следующее:
TableComponent
displayedColumns: string[] = ['A', 'B', 'C'];
availableColumns: string[] = [];
openDialog() {
const dialogRef = this.dialog.open(ColumnsDialog, {
width: '500px',
height: '500px',
data: {
displayedColumns: this.displayedColumns,
availableColumns: this.availableColumns
},
});
dialogRef.afterClosed().subscribe(result => {
this.displayedColumns = result.displayedColumns,
this.availableColumns = result.availableColumns
});
}
ColumnsDialog
constructor(public dialogRef: MatDialogRef<ColumnsDialog>,
@Inject(MAT_DIALOG_DATA) public data: any) {}
onCloseClick(): void {
this.dialogRef.close(this.data);
}
Вы также, конечно, должны использовать функцию onCloseClick()
из кнопки в вашем диалоге:
<div mat-dialog-actions>
<button mat-button (click)="onCloseClick()">Update</button>
</div>
Вы можете сделать это полностью с HTML, если хотите, поэтому вам не нужно определять функцию:
<div mat-dialog-actions>
<button mat-button [mat-dialog-close]="data">Update</button>
</div>