本文转自:https://www.techiediaries.com/angular-material-dialogs/

In this tutorial, we're going to learn how to use the Angular Material Dialog component to build a custom dialog example.

We'll also see common cases to work with the Angular Material Dialog such as:

  • how to create a dialog,
  • how to pass data to the dialog component,
  • how to get data back from a dialog component,
  • how to use various configuration options for dialogs.

Before starting, first, you’ll need to make sure you have followed the steps to setup Angular Material for your Angular application.

Most Angular Material components have their own module so you can use a specific component without importing the whole library. For Dialog you need to import the MatDialogModule module:

import {MatDialogModule} from "@angular/material";

Next you need to add the module to your main module imports array.

/* ... */

@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, MatDialogModule],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}

Now you are ready to create your dialog. The process involves a few steps:

  • first, you need to import and inject MatDialog in the component constructor where you want to call the dialog,
  • next, you need to create an instance of MatDialogConfig which holds configuration options for the dialog (this is optional, you can also pass a literal object i.e {...}),
  • finally you need to call the open() method of the injected MatDialog instance with the component to use as the body of the dialog and the configuration object.

From the final step, you can understand that the open() method needs a component as a body so you'll need to create an Angular component.

Use the Angular CLI to generate a component:

ng g component dialog-body

Next, you’ll need to import the dialog component in the app module and add it into the declarations and entryComponents arrays:

import { BrowserModule } from "@angular/platform-browser";
import { NgModule } from "@angular/core";
import { MatDialogModule } from "@angular/material"; import { AppComponent } from "./app.component";
import { DialogBodyComponent } from "./dialog-body/dialog-body"; @NgModule({
declarations: [AppComponent, DialogBodyComponent],
imports: [BrowserModule, MatDialogModule],
providers: [],
bootstrap: [AppComponent],
entryComponents: [DialogBodyComponent]
})
export class AppModule {}

Step 1: Importing and Injecting MatDialog

To be able to call the dialog, you'll need to import and inject MatDialog in the calling component i.e for this example AppComponent:

import { Component, Inject } from "@angular/core";
import {
MatDialog,
MatDialogConfig
} from "@angular/material"; @Component({
selector: "app-root",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"]
})
export class AppComponent {
title = "Example Angular Material Dialog"; constructor(private dialog: MatDialog) {}
}

Step 2: Opening the Dialog

Next add the openDialog() method which opens the dialog:

  openDialog() {
const dialogConfig = new MatDialogConfig();
this.dialog.open(DialogBodyComponent, dialogConfig);
}

As we already said, you open the dialog by calling the open() method of the injected MdDialog instance and you pass the dialog component as a parameter and an optional configuration object.

You can pass different configuration option such as:

  • data: object or string to send data to the dialog,
  • height: set the height of the dialog,
  • width: set the width of the dialog,
  • disableClose: enable/disable closing the form by clicking outside the dialog,
  • autoFocus: if true, automatically sets focus on the first form field etc.

Step 3: Creating the Dialog Component

We have previously generated the dialog body component. Now let's use Angular Material directives designed to style the dialog body:

  • mat-dialog-title: This directive is used for the title of the dialog,
  • mat-dialog-content: this directive is designed for the container of body of this dialog,
  • mat-dialog-actions: this directive is designed for the container of the action buttons at the bottom of the dialog

Open src/dialog-body/dialog-body.htmland add:

<h2 mat-dialog-title>This is a Dialog title</h2>

<mat-dialog-content>

<p> Place content here </p>
</mat-dialog-content> <mat-dialog-actions>
<button class="mat-raised-button" (click)="close()">Close</button>
</mat-dialog-actions>

Step 4: Closing the Dialog and Implementing Action Buttons

The MatDialogRef provides a reference of the opened dialog. This reference can be used to close the dialog and also to notify the calling component when the dialog gets closed. Any component created via MatDialog can inject the MatDialogRef reference and use it to perform the previously mentionned operations.

Now let's implement the close button. First import MatDialogRef from @angular/material:

import { MatDialogRef } from "@angular/material";

Next inject MatDialogRef<DialogBodyComponent> as dialogRef.

@Component({
selector: "dialog-b",
template: "<h1>Dialog body component</h1>"
})
export class DialogBodyComponent {
constructor(
public dialogRef: MatDialogRef<DialogBodyComponent>){}

Finally, you can use this reference to the dialog component to control many aspects such as closing the dialog and sending data back to the parent component etc.


close() {
this.dialogRef.close();
}

You can optionally pass some value which can be received back in the calling component.

    close() {
this.dialogRef.close("Thanks for using me!");
}

Step 5: Sending Data to The Dialog Component

To be able to send or more accurately share data with the dialog component, you can use the data option to pass data:

  openDialog() {
const dialogConfig = new MatDialogConfig();
dialogConfig.data = "some data";
let dialogRef = this.dialog.open(DialogBodyComponent, dialogConfig);
}

You can also pass objects instead of simple string values:

dialogConfig.data = { name: "some name"};

For accessing shared data in your dialog component, you need to use the MAT_DIALOG_DATAinjection token:

import { Component, Inject } from "@angular/core";

import {
MAT_DIALOG_DATA
} from "@angular/material"; @Component({
selector: "dialog-b",
template: "passed in data: "
})
export class DialogBodyComponent {
constructor(@Inject(MAT_DIALOG_DATA) public data: any) {}
}

Step 6: Receiving Data from The Dialog Component

In the calling component, we can get the data passed from the dialog. From the previous example, you can see that calling the open() method returns a reference to the dialog:

 let dialogRef = this.dialog.open(DialogBodyComponent, dialogConfig);

This dialog reference has a afterClosed() observable which can be subscribed to. The data passed from the dialog is emitted from this observable.

dialogRef.afterClosed().subscribe(value => {
console.log(`Dialog sent: ${vaue}`);
});

Conclusion

Dialogs represents an important UI component for most web application and thanks to Angular Material you can quickly craft professional and good looking dialogs without having to deal with CSS.

10 Apr 2018

AhmedFollow Django developer

[转]Angular 4|5 Material Dialog with Example的更多相关文章

  1. [转]Angular4 引用 material dialog时自定义对话框/deep/.mat-dialog-container

    本文转自:https://blog.csdn.net/qq_24078843/article/details/78560556 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  2. 【转】Android新组件Material Dialog,SwipeRefreshLayout,ListPopupWindow,PopupMenu等

    朝花夕拾----新组件的学习和使用 分类: Android UI2015-06-26 11:31 440人阅读 评论(0) 收藏 举报 uidialogMaterial   目录(?)[-] Mate ...

  3. angular material dialog应用

    1. 打开弹窗的点击事件 project.component.html <button mat-icon-button class="action-button" (clic ...

  4. 拟物设计和Angular的实现 - Material Design(持续更新)

    Material Design是Google最新发布的跨平台统一视觉设计语言.直接翻译是物质设计,但是我更倾向于使用"拟物设计"更为准确. 据谷歌介绍,Material Desig ...

  5. Angular 学习笔记 (Material Datepicker)

    https://material.angular.io/components/datepicker/overview 官网介绍很清楚了,这里记入一下我比较不熟悉的. 1. moment js Angu ...

  6. Angular 学习笔记 Material

    以后都不会写 0 到 1 的学习记入了,因为官网已经写得很好了. 这里只写一些遇到的坑或则概念和需要注意的事情. Material Table 1. ng-content 无法传递 CdkColumn ...

  7. 拟物设计和Angular的实现 - Material Design

    Material Design是Google最新发布的跨平台统一视觉设计语言.直接翻译是物质设计,但是我更倾向于使用"拟物设计"更为准确. 据谷歌介绍,Material Desig ...

  8. Angular 学习笔记 (Material Select and AutoComplete)

    记入一些思考 : 这 2 个组件有点像,经常会搞混. select 的定位是选择. 目前 select 最糟糕的一点是 not search friendly. 还有当需要 multiple sele ...

  9. Angular 学习笔记 (Material table sticky 原理)

    更新 : 2019-12-03 今天踩坑了, sticky 了解不够深 refer http://www.ruanyifeng.com/blog/2019/11/css-position.html 阮 ...

随机推荐

  1. jdbc随笔

    通过jdbc连接数据库的基本步骤:  导入jar包驱动类  jdbc语法:jdbc:子协议:厂商内容  对于mysql而言:jdbc:mysql://主机地址:端口号/库名               ...

  2. RQNOJ 3 Jam的计数法

    一道模拟题,用的vector比用链表要方便很多,毕竟不需要自己写,因为是递增的,所以每一次你都要去检查最后一位加1之后有没有越界,如果没越界你就可以把他当前的字符删掉替换成他下一位的字符就可以了,如果 ...

  3. poj1860

    刚上来一堆英文着实有点蒙逼,仔细分析是一个Bellman的变形,只要能找出一个无限增大的环这个题就好解决了,我这里用的SPFA,用邻接链表进行储存,直接套用的模板,部分变量名字没有改的很好 #incl ...

  4. 75.iOS内存管理

    堆区和栈区 1.栈区:由编译器自动分配释放,函数的参数值,局部变量等值 2.堆区:一般由开发人员分配释放,若不释放,则可能会引起内存泄漏 NSString *string = @"abcd& ...

  5. 基于OpenCV的图书扫描识别程序开发

    1.AndroidStudio环境配置 https://www.cnblogs.com/little-monkey/p/7162340.html

  6. lwip-动态内存管理

    动态内存管理涉及两类重要函数,内存分配函数,内存释放函数,如C语言中的malloc和free. 内存分配的本质是:在事先准好一大块内存堆(可以理解为一个很大的数组)中分配合适的空间,然后将该空间起始地 ...

  7. C# 从后台代码同步或异步注册Javascript到页面之RegisterStartupScript和RegisterClientScriptBlock的区别

    下面来讲讲同步注册JS和异步注册JS的区别 同步注册JS:RegisterClientScriptBlock,相当于在 form开始处(紧接 <form runat="server&q ...

  8. C++中的return和exit区别

    在main函数中,return和exit经常混用,两者的一个区别:return会执行statck unwinding,而exit不会.如果触发了信号,exit也同样不会做stack unwinding ...

  9. Dockerfile 构建容器

    本文是最简单的Dockerfile教程,创建tomcat容器,并跑自己的java程序 首先需要准备几个东西 1.你的java web(test.war) 程序,最好打包成一个 war:(主要是没测试 ...

  10. 【UWP】手动实现 WebAuthenticationBroker

    在 UWP 中,如果要进行 OAuth 授权,那很大概率是会用上 WebAuthenticationBroker 这个类的,例如微博授权这种. 在一般情况下来说,WebAuthenticationBr ...