如何从 Angular 材质对话框中获取数据?

Posted

技术标签:

【中文标题】如何从 Angular 材质对话框中获取数据?【英文标题】:How to get data from Angular material dialog? 【发布时间】:2019-11-20 15:07:24 【问题描述】:

如何从 Angular 材质对话框中的输入字段获取数据?

这是我的代码:

TS

import  Component, OnInit, Inject  from '@angular/core';
import  MatDialog, MatDialogRef, MAT_DIALOG_DATA  from '@angular/material';

@Component(
  selector: 'app-test',
  templateUrl: './foo.component.html',
  styleUrls: ['./foo.component.scss']
)

export class SomeComponent implements OnInit 

  name: String;

  constructor(public dialog: MatDialog)  

  ngOnInit() 
  

  openDialog(): void 
    const dia = this.dialog.open(SomeDialogComponent, 
      width: "250px",
      data:  name: this.name 
    );

    dia.afterClosed().subscribe(result => 
      console.log("The dialog was closed");
      console.log("Your Name: " + this.name);
      this.name = result;
    );
  


@Component(
  selector: "someDialog",
  templateUrl: "someDialog.html",
  styleUrls: ["someDialog.scss"]
)

export class SomeDialogComponent 

  constructor(public dialog: MatDialogRef<SomeDialogComponent>,
    @Inject(MAT_DIALOG_DATA) public data: any)  

  onNoClick(): void 
    this.dialog.close();
  

对话框 HTML

<body>
    <h1 mat-dialog-title>Enter your name</h1>

    <div mat-dialog-content class="contentBox">
        <mat-form-field>
            <input type="text" matInput>
        </mat-form-field>

        <div mat-dialog-actions>
            <button mat-raised-button (click)="onNoClick()">Exit</button>
            <button mat-raised-button (click)="sendData()">Ok</button>
        </div>
    </div>
</body>

我从 Angular 材料的官方文档 https://material.angular.io/components/dialog/overview 中获得了这段代码,但它没有按预期工作。


预期

我希望对话框在不使用模型的情况下将数据传回组件,就像我在 sn-p 中放入的变量一样。

实际

对话框不会将数据传回组件,而是在记录时返回undefined

【问题讨论】:

你需要将Dialog的字段绑定到构造函数中的data。使用[(ngModel)][(value)] 大多数时候你的data 将是一个对象(因此使用多个字段更容易)所以你的输入字段应该是数据的属性(如data.inputField 我明白了,你能提供这两种情况的代码示例吗? 【参考方案1】:
    您没有将输入值绑定到所需的数据属性 你没有'sendData()'方法 最重要的是:您在将结果值分配给它之前记录名称。

将您的对话框 html 代码更新为:

<body>
<h1 mat-dialog-title>Enter your name</h1>

<div mat-dialog-content class="contentBox">
    <mat-form-field>
        <input [(ngModel)]="data.name" matInput>
    </mat-form-field>

    <div mat-dialog-actions>
        <button mat-raised-button (click)="onNoClick()">Exit</button>
        <button mat-raised-button [mat-dialog-close]="data.name">Ok</button>
    </div>
</div>

它应该像那样工作。

【讨论】:

我有一个错误:Can't bind to 'ngModel' since it isn't a known property of 'input'. 啊,我修好了:***.com/questions/38892771/… logger还在控制台输出undefined,数据依然没有传输。 嗯,奇怪。我发现它在我第一次输入内容时给了我undefined。但是当我再次打开它时,数据被保存了,我再次按下确定,这次它正在发送数据。 对不起,我的错。它是第一次发送数据,只是console.log 似乎第二次捕获它。现在一切正常,谢谢!

以上是关于如何从 Angular 材质对话框中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

从 Angular 6 材质树中的子节点获取父层次结构

如何使角度材质对话框可拖动[重复]

在 Angular 材质垫对话框中隐藏/显示列

Angular 材质:弹出窗口:允许在原始窗口中单击并且不要灰显

Angular 材质:Shake MatDialog

Angular Storybook 材质对话框