如何在关闭前检查子组件是否有未保存的数据

How to check if child component has unsaved data before closing

在我的应用程序中,以前的开发人员使用 Infragistics OverlayService 以模态模式显示某些组件,工作正常但随着时间的推移,在使用其他 3 方控件时,我发现许多问题,如 zIndex 等和一些其他奇怪的行为。所以我想在不破坏一切的情况下尝试用 Angular 对话框替换 OverlayService。在这样做的过程中,我遇到了如果用户单击右上角的 x 如何关闭对话框的问题。 通常这不是问题,因为我可以调用

this.dialogRef.close()

但这里不是这种情况,因为 X 在不同的组件中。当用户打开我使用的对话框时

const dialogRef = this.dialog.open(CreateQuickMailComponent,
     {
       disableClose: true, position: {
        top: '0px',
        right: '0px'
       },
        panelClass: 'inner-no-pad-dialog',
        autoFocus: false
      })

那么该组件的模板代码如下所示

<app-header-container title="New Mail">
    <div class="sample-column card-wrapper">
        <app-quick-mail-form (edit)="edit($event)"></app-quick-mail-form>
    </div>
</app-header-container>

app-quick-mail-form 是具有所有逻辑的表单,从那里我可以使用 this.dialogRef.close() 关闭对话框。我需要的是一种从 app-header-container 执行相同操作的方法,它在点击时右上角有 X。

我的 app-header-container 模板

<div class="container__element">
    <igx-navbar title="{{ title }}">
        <igx-icon (click)="dismiss()">close</igx-icon>
    </igx-navbar>

    <ng-content></ng-content>
</div>

所以我可以通过使用 this.dialogRef.close() 并引用 private dialogRef: MatDialogRef 来关闭对话框,但是如何才能我在调用 close() 之前检查底层表单是否脏了,以询问用户在关闭之前是否想要安全? 由于此组件被多个组件使用,因此我无法对引用进行硬编码。

所以我愿意接受任何想法或建议

您可以将 @Input 添加到 <app-header-container> 组件,以指示是否允许关闭。

使用它的每个组件都可以传入任何有意义的标准:

<app-header-container title="New Mail" [allowDismiss]="!mailForm.isDirty">
    <div class="sample-column card-wrapper">
        <app-quick-mail-form #mailForm (edit)="edit($event)"></app-quick-mail-form>
    </div>
</app-header-container>
@Input() allowDismiss = true;

public dismiss() {
  if(!this.allowDismiss) {
    return;
  }

  this.dialogRef.close();
}