# Dialog

以 app.component.ts 與 dialog.component.ts(dialog) 為例

新增 material dialog

app.component.ts

// 匯入 dialog
import { MatDialog } from "@angular/material/dialog";
// dialog.open(component,{dialog config})
openDialog(): void {
    this.dialog.open(DialogComponent, {
      disableClose: true,
      autoFocus: false,
      width: '600px',
      height: '500px',
      // 打開的 dialog 前面加入樣式 class dialog
      panelClass: "dialog"
    });
  }
<button (click)="openDialog">打開 dialog</button>

dialog.component.ts

關掉 dialog 方式

<!-- 方式一 -->
<button mat-dialog-close>關閉 dialog</button>
<!-- 方式二 -->
<button (click)="closeDialog()">關閉 dialog</button>
import { MatDialogRef } from "@angular/material/dialog";

export class RecommendAdviseDialogComponent implements OnInit {
  adviseText = "";
  email = "pollex@pollex.com.tw";
  constructor(public dialogRef: MatDialogRef<RecommendAdviseDialogComponent>) {}
  closeDialog(): void {
    const obj: data = {
      adviseText: this.adviseText,
      email: this.email,
    };
    // 關掉 dialog 並傳出資料到打開 dialog 的地方
    // 以此範例為 dialog.component.ts
    this.dialogRef.close(obj);
  }
}

app.component.ts

// 匯入 dialog
import { MatDialog } from "@angular/material/dialog";
// dialog.open(component,{dialog config})
openDialog(): void {
  const dialogRef = this.dialog.open(DialogComponent, {
    disableClose: true,
    autoFocus: false,
    width: '600px',
    height: '500px',
    panelClass: "dialog"
  });
  // 在 dialog 關掉以後訂閱它,result 為剛剛回傳出來的值
  dialogRef.afterClosed().subscribe(result => {
    this.advise = result
    // ... 下面可以放其他的操作
  })
}

今天做專案時遇到 material 一些坑,不管怎麼設計都無法更改 material 預設的樣式,可以使用 panelClass 自定義 dialog class 名稱,再到全域的 scss 自定義樣式

.dialog .mat-dialog-container {
  padding: 0px;
}