ChatGPT解决这个技术问题 Extra ChatGPT

如何将数据传递给角度材料2的对话框

我正在使用 dialog box of angular material2。

我想将数据传递给打开的组件。这是我在单击按钮时打开对话框的方式

let dialogRef = this.dialog.open(DialogComponent, {
            disableClose: true,
            data :{'name':'Sunil'}
        });

在文档页面上有数据属性,但我在安装的包中检查了 MdDialogConfig

/**
 * Configuration for opening a modal dialog with the MdDialog service.
 */
export declare class MdDialogConfig {
    viewContainerRef?: ViewContainerRef;
    /** The ARIA role of the dialog element. */
    role?: DialogRole;
    /** Whether the user can use escape or clicking outside to close a modal. */
    disableClose?: boolean;
    /** Width of the dialog. */
    width?: string;
    /** Height of the dialog. */
    height?: string;
    /** Position overrides. */
    position?: DialogPosition;
}

配置类中没有数据属性。

现在如何访问传递的数据?


S
Saad Abbasi

对于最新版本的对话框(这是 Angular 5 之前的版本,对于 5,请参阅下面的更新),您可以执行以下操作以通过配置传递数据,这更加简单和清晰。

当您打开对话框时,您可以通过添加数据作为配置参数来做到这一点(只需忽略用于说明目的的宽度和高度):

this.dialogRef = this.dialog.open(someComponent, {
  width: '330px',
  height: '400px',
  data: {
    dataKey: yourData
  }
});

然后在对话框中打开的组件中,您可以像这样访问它:

import {MD_DIALOG_DATA} from '@angular/material';
import { Inject } from '@angular/core';


constructor(
   @Inject(MD_DIALOG_DATA) public data: any
) { }

ngOnInit() {
  // will log the entire data object
  console.log(this.data)
}

或者您可以在模板或其他方法中使用访问它,但您明白了。

更新 Angular 5

材质中的所有内容都从 Md 更改为 Mat,所以如果在 Angular 5 上,导入如下:

import {MAT_DIALOG_DATA} from '@angular/material'

然后像注入

@Inject(MAT_DIALOG_DATA) public data: any

更新 Angular 9

MAT_DIALOG_DATA 导入位置已更改为:

import {MAT_DIALOG_DATA} from '@angular/material/dialog';

任何返回并使用新框架版本的更新代码编辑帖子的人都会获得支持,谢谢!
这是我第二次不得不参考这个答案,最后一次忘记投票了。
更新的解决方案完美运行。谢谢你。
完全正确的更新!感谢您的解决方案!
F
Fredrik Lundin

更新 2(角度 5+)

这个答案已经过时了。看看epiphanatic's answer instead

更新您可以使用 dialogRef.componentInstance.myProperty = 'some data' 在组件上设置数据。你需要这样的东西: let dialogRef = this.dialog.open(DialogComponent, { disableClose: true, }); dialogRef.componentInstance.name = 'Sunil';然后在您的 DialogComponent 中,您需要添加您的 name 属性: ... @Component({ ... }) export class DialogComponent { public name: string; ... }

下面的文字在 @angular/material 的较新版本中无效

我没有找到任何文档,所以我也开始研究源代码。因此,这可能不是官方的做法。

我成功定位到 dialogRef._containerInstance.dialogConfig.data 中的数据;所以你可以做的是例如 let name = dialogRef._containerInstance.dialogConfig.data.name;控制台.log(名称); // 苏尼尔


dialogRef._containerInstance 未定义。我检查了 MdDialogRef 没有属性 _containerInstance
@SunilGarg,你是对的,我用旧版本的库试过。使用更新版本时,实际上从 MdDialogConfig 接口中删除了 data 属性
我试图更新材料库,但这就是我面临的stackoverflow.com/questions/42667276/…
我也尝试过,并尝试过 console.log(this.name);在 DialogComponent 的构造函数中。但不工作
好吧,在这种情况下,您不要将它传递给构造函数,而是在创建组件后设置它。所以你需要在以后的生命周期钩子中检查它,或者只是将它绑定到你的模板@SunilGarg
D
Darren Street

我想我会给我们这些还在学习的人一个更全面的答案:

与材料示例不同,我将对话框配置为拥有自己的组件文件(html、css 和 ts),以便于调试。

主组件文件“x.component.ts”(调用对话框)

1)添加导入语句

import { MatDialog} from '@angular/material';

2)将属性添加到构造函数参数

public dialog: MatDialog

3) 定义调用对话框的代码

  openDialog(title: string, text: string): void {
const dialogRef = this.dialog.open(DialogComponent, {
  width: '350px',
  data: {dialogTitle: title, dialogText: text}
);

dialogRef.afterClosed().subscribe(result => {
});

  const dialogSubmitSubscription = 
  dialogRef.componentInstance.submitClicked.subscribe(result => {
  dialogSubmitSubscription.unsubscribe();
});

}

使用 openDialog() 从您的 html 文件中调用该函数。我正在引用 DialogComponent,因此请确保将其导入到您的模块中。

import { DialogComponent } from './dialog/dialog.component';

entryComponents: [DialogComponent]

在您的 entryComponents 数组中声明它

4) 在您的 dialog.component.ts 文件中,添加导入

import { Component, Output, EventEmitter, Inject, OnInit} from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';

5) 定义属性和功能

dialogTitle: string;
dialogText: string;
@Output() submitClicked = new EventEmitter<any>();

  constructor(
    public dialogRef: MatDialogRef<DialogComponent>,
    @Inject(MAT_DIALOG_DATA) public data: DialogData) {}


  ngOnInit() {
    this.dialogTitle = this.data.dialogTitle;
    this.dialogText = this.data.dialogText;
  }

  saveMessage() {
    const data = 'Your data';
    this.submitClicked.emit(data);
    this.dialogRef.close();
  }

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

6) 最后是 HTML

<h1 mat-dialog-title>{{dialogTitle}}"</h1>
<div mat-dialog-content>
  <p>{{dialogText}}</p>

</div>
<div mat-dialog-actions>
  <button mat-button (click)="saveMessage()" >Ok</button>
  <button mat-button (click)="closeDialog()" cdkFocusInitial>No Thanks</button>

</div>

我希望它有所帮助。


这非常有帮助,谢谢。虽然文档有这些信息,但不是很清楚(无论如何对我来说),这有助于我启动和运行。谢谢!
超级完整的答案!谢谢!
正是我需要的!
@Darren,你好,谢谢这个例子。我得到 Cannot find name 'DialogData' 知道吗?
对话框数据是您从主组件传递到对话框组件的对象。 @Inject(MAT_DIALOG_DATA) 公共数据:DialogData。您将其注入对话框构造函数中。实际类型是您根据需要自行定义的类型。我的示例被称为 DialogData 但可以是任何东西或只是一个对象文字
ס
סטנלי גרונן

对于任何发现角度 10 或 11 的人,唯一的区别是您使用:

import {MAT_DIALOG_DATA} from '@angular/material/dialog';

代替:

import {MAT_DIALOG_DATA } from '@angular/material';

官方页面是 here


j
jllangston

对于 Angular 13,要将对象传递到对话框数据结构中,我必须使用以下内容:

const dialogRef = this.dialog.open(MyDialog, {
  data: { myObjectHolder: myObject }
});

然后在对话框类中使用:

private myObject: MyObjectClass;

constructor(@Inject(MAT_DIALOG_DATA) data: { myObjectHolder: MyObjectClass }) {
    this.myObject = data.myObjectHolder;
}

T
TheDevGuy

所以我添加了方法并且它在一个组件上工作,但是如果我想制作一个对话框(另一个组件),它就不起作用

表格组件和删除按钮

  openDeleteDialog(user) {
    this.dialog.open(DeleteUserDialogComponent, {
      width: '30%', disableClose: true, data: user
    });
  }

组件对话框

export class DeleteUserDialogComponent {

  dataSource = new MatTableDataSource();

  constructor(public dialog: MatDialog, public dialogRef: MatDialogRef<DeleteUserDialogComponent>, private userService: UserService, @Inject(MAT_DIALOG_DATA) public data: any) {}


  deleteUser() {
    this.dataSource.data.splice(this.dataSource.data.indexOf(this.data), 1);
    this.dataSource.data = [...this.dataSource.data];
    console.log(this.dataSource.data);
    console.log(this.data)
  }

  click(): void {
    this.dialogRef.close();
  }
}

b
blixenkrone

如果您使用对话框处理 HTTP 数据,请记住 RxJS 和 Observables 非常适合此问题。

对话服务:

    private _dialogDataSubj$ = new Subject<DialogData>();
    dialogData$ = this._dialogDataSubj$.asObservable()

    setDialogData(data: DialogData) {
        this._dialogDataSubj$.next(data)
    }

在对话框 HTML 中:

<ng-container *ngIf="dialogData$ | async as data; else doneTmp">

我不确定是否只有我,但我无法仅使用对话框数据引用 (@Inject) 更新我的材质对话框中的数据,即:dialogRef.data = newData


另外,有这种问题,结果是我传递了错误的数据类型,当要更新时。如果您不想使用 observables,可以通过两种方式进行更新: 1. 使用注入的数据对象并分配一个新对象。 2. this.dialogRef.componentInstance.data = newData