【问题标题】:Display a simple alert dialog in Material Angular在 Material Angular 中显示一个简单的警报对话框
【发布时间】:2018-03-25 02:43:27
【问题描述】:

我正在使用 Material Angular(来自 Angular Material)。该站点中的示例似乎有点过于复杂,互联网上的所有其他教程似乎都已过时或改用 AngularJS。如何显示带有标题、消息和确认/取消按钮的简单警报(就像 Android 的 AlertDialog)?

【问题讨论】:

标签: angular typescript angular-material2


【解决方案1】:

编辑

您还可以在组件的 HTML 文件中使用模板引用(或更常见的“组件视图”),然后在组件的 TypeScript 文件中引用它,然后将该引用传递给 MatDialog#open

或者,您可以在组件视图中访问模板的引用,然后将其传递给您定义的接受该引用的方法。

如果您对我刚刚输入的内容感到困惑,请查看下面的代码(第一个对话框展示了第一句话,第二个对话框展示了我在第二句话中解释的内容)

(再次假设如下结构)

app/
  app.component.html
  app.component.ts

app.component.html:

<button mat-button (click)="openDialogWithRef(firstDialog)">Open dialog with reference</button>
<button mat-button (click)="openOtherDialog()">Open dialog in code</button>

<ng-template #firstDialog>
  <h2 matDialogTitle>Hello, world!</h2>
  <p matDialogContent><em>Content for this dialog goes here...</em></p>
  <mat-dialog-actions align="end">
    <button mat-button matDialogClose>Dismiss</button>
  </mat-dialog-actions>
</ng-template>

<ng-template #secondDialog>
  <h2 matDialogTitle>Hello, second dialog!</h2>
  <p matDialogContent>Interesting note: This template reference was referenced in code with the <code>@ViewChild</code>, which lets you query components/template references in the component view.</p>
  <mat-dialog-actions align="end">
    <button mat-button matDialogClose>Dismiss</button>
  </mat-dialog-actions>

app.component.ts(缩写):

import { ViewChild, TemplateRef } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';

// ...
export class AppComponent {
  @ViewChild('secondDialog') secondDialog: TemplateRef<any>;

  constructor(private dialog: MatDialog) { }

  openDialogWithRef(ref: TemplateRef<any>) {
    this.dialog.open(ref);
  }

  openOtherDialog() {
    this.dialog.open(this.secondDialog);
  }
}

这种方法可以省去您为对话框创建新组件以及在模块的entryComponents 中声明它们的麻​​烦。

但是,如果您在单个组件视图中有多个对话框模板,这很快就会变得很麻烦。


原答案

这是您要求的一个简单示例:

(假设如下结构)

app/
  my-alert-dialog/
    my-alert-dialog.component.html
    my-alert-dialog.component.ts
  app.component.ts
  app.module.ts

my-alert-dialog.component.html

<h2 matDialogTitle>Unregister?</h2>
<mat-dialog-content>
  <p>When you unregister, all your data will be removed. Continue?</p>
</mat-dialog-content>
<mat-dialog-actions align="end">
  <!--
    Note that you can pass in anything to the `matDialogClose` attribute. This also includes objects, arrays, etc.
    Just make sure that you make it a property binding with those [] brackets
    Example: <button mat-button [matDialogClose]="{'lol': true}">Cancel</button>
  -->
  <button mat-button matDialogClose="cancel" color="primary">Cancel</button>
  <button mat-button matDialogClose="confirm" color="warn">Unregister</button>
</mat-dialog-actions>

上面代码的解释:

  • [matDialogTitle] / [mat-dialog-title]:指示对话框标题的指令(通常用于 h2 元素)。
  • [matDialogContent] / [mat-dialog-content] / mat-dialog-content:指示对话框内容的指令。
  • [matDialogActions] / [mat-dialog-actions] / mat-dialog-actions:指示对话框操作的指令。
  • [matDialogClose] / [mat-dialog-close]:一个指令(通常用在 button 元素上)指示单击此元素时应关闭对话框。或者,该指令可以包含一个参数(any 类型),然后可以将其传递给打开此对话框的组件。

my-alert-dialog.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-alert-dialog', // Replace with your own selector
  templateUrl: './my-alert-dialog.component.html'
})
export class MyAlertDialogComponent { }

app.component.ts(已编辑)

import { MatDialog } from '@angular/material';
import { MyAlertDialogComponent } from './my-alert-dialog/my-alert-dialog.component';
// ...
export class AppComponent {
  constructor(private dialog: MatDialog) { }
  unregister() {
    let dialogRef = this.dialog.open(MyAlertDialogComponent);
    dialogRef.afterClosed().subscribe(result => {
      // NOTE: The result can also be nothing if the user presses the `esc` key or clicks outside the dialog
      if (result == 'confirm') {
        console.log('Unregistered');
      }
    })
  }
}

app.module.ts(已编辑)

import { MatDialogModule } from '@angular/material';
import { MyAlertDialogComponent } from './my-alert-dialog/my-alert-dialog.component';

@NgModule({
  declarations: [
    // ...
    MyAlertDialogComponent
  ],
  imports: [
    // ...
    MatDialogModule
  ],
  entryComponents: [
    // See https://material.angular.io/components/dialog/overview#configuring-dialog-content-via-code-entrycomponents-code- for more info
    MyAlertDialogComponent
  ]
})
export class AppModule { }

Demo

【讨论】:

  • 有没有一种方法我不需要创建组件并使用默认模板?
  • @ElgsQianChen AFAIK,目前不可能。
  • @QianChen 您可以使用对存在于同一组件 HTML 文件中的模板的模板引用,然后获取该引用并将其传递给 MatDialog#open
  • 嗨,@Edric。我正在尝试使用您的代码,但是您如何将 HTML 对象传递给dialogMsg?我只能将一个字符串传递给正文。
  • @user3622260 您可以将 HTML 作为字符串传入,然后在对话框的代码中对其进行清理,或者传入您尝试设置的 HTML 的清理版本。
【解决方案2】:

我使用了一个甜蜜的警报。 https://www.freakyjolly.com/angular-sweetalert2-tutorial/#.X2nNxmgzZPY

这是以角度创建警报的最简单快捷的方法。

$ npm install --save sweetalert2

在您的 TS 文件中使用 import Swal from 'sweetalert2'; 和警报 Swal.fire('This is a simple and sweet alert')

【讨论】:

  • 我尝试了所有答案,这是一件更好的事情,因为它更容易且更可定制,任何阅读的人都应该使用它。
【解决方案3】:

安装npm i @angular/material,为dialog添加component,例如EmployeeDialog

假设您希望对话框中的table 以及右上角的close button

EmployeeDialog.html文件代码

<div md-dialog-content>
<!-- This button to close dialog -->
<button class="close" mat-button (click)="onNoClick()">
 <mat-icon>close</mat-icon>
 
</button>   
<div>   
 <table>
   <th>Id</th><th>Name</th>Addess<th></th><
   <tr *ngFor="let emp of emplyee; let i = index" border="1">
     <td>{{emp.DeviceID}}</td>
     <td>{{emp.FriendlyName}}</td>
   </tr>
 </table>   
</div>   
</div>

你的EmployeeDialog.ts 文件应该是

import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
export class EmployeeDialog implements OnInit {

  constructor(public dialogRef: MatDialogRef<EmployeeDialog>, @Inject(MAT_DIALOG_DATA) public data: any){ }
  
  //write code to handle close
  }
}

现在如果你想从SourceComponent打开EmployeeDialog,只要Employeelist()函数调用你diaglog就会打开

SourceComponent.ts文件

public Employeelist()
{
    const dialogRef = this.dialog.open(EmployeeDialog, {
    width: '80%',
    height:'80%',
    panelClass: 'my-dialog',
    disableClose: true ,
    data: employeeList
  });
}

app.module.ts 文件中的代码

import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';

import { MatDialogModule } from '@angular/material/dialog';
import { MatButtonModule } from '@angular/material/button';

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    相关资源
    最近更新 更多