5

我正在尝试使用Angular 2 中的对话框组件@angular/material2.0.0-beta.1。我想要完成的是将数据(这是人们从界面中选择的值,对话框用于使人们确认他们选择的值)发送到对话框并显示它。例如,对话框应该这样说:

您选择了:

选项 1:价值

选项 2:价值

选项 3:价值

取消 | 确认

如何将这些值传递给我创建的对话框,以便我可以在视图模板中像 {{value}} 那样访问它们?我认为它使用数据配置,但我似乎找不到关于如何使用它的好的文档或示例。这是我一直在尝试的:

let config = new MdDialogConfig().data();
let dialogRef = this.dialog.open(DialogComponent);

对话框组件

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

@Component({
   selector: 'dialog',
   template: require('./dialog.component.pug'),
   styleUrls: [
     './dialog.component.scss'
   ]
})

export class DialogComponent {
   constructor(public dialogRef: MdDialogRef<DialogComponent>) {}
}
4

3 回答 3

16

在父组件中:

const config = new MdDialogConfig();

config.data = [
  // for example:
  'value 1',
  'value 2'
];

const dialogRef = this.dialog.open(DialogComponent, config);

DialogComponent

import { Component, OnInit } from '@angular/core';
import { MdDialogRef }       from '@angular/material';

@Component({
  selector: 'dialog',
  template: require('./dialog.component.pug'),
  styleUrls: [
    './dialog.component.scss'
  ]
})
export class DialogComponent implements OnInit {
  private values;

  constructor(public dialogRef: MdDialogRef<DialogComponent>) {}

  ngOnInit(): void {
    this.values = this.dialogRef.config.data;
  }
}

和示例模板(HTML 版本):

<md-dialog-content>
  <md-list *ngIf="values">
    <md-list-item *ngFor="let value of values">{{ value }}</md-list-item>
  </md-list>
</md-dialog-content>

更新@angular/material——2.0.0-beta.3

从Angular Material 2.0.0-beta.3 版本开始,不再可以访问config(和config.dataMdDialogRef<T>. 相反,您应该注入MD_DIALOG_DATA令牌来访问传递给对话框组件的任何数据。

进口:

import { Component, Inject, OnInit, Optional } from '@angular/core';
import { MD_DIALOG_DATA, MdDialogRef }         from '@angular/material';

构造函数:

constructor(
  @Optional() @Inject(MD_DIALOG_DATA) private dialogData: any,
  private dialogRef: MdDialogRef<DialogComponent>
) {}

ngOnInit方法:

ngOnInit(): void {
  // alternatively, rename ‘dialogData’ to ‘values’ and remove the
  // ‘ngOnInit’ method
  this.values = this.dialogData;
}

在许多情况下,您需要保留@Optional()装饰器,直到问题 4086得到解决。

于 2017-03-01T13:38:35.083 回答
2

更新:绝对使用上述 Inject 方法来获取您的数据。这种方式取决于访问不能保证在版本之间保持不变的私有成员

如果您使用的是新的 2.0.0 beta 3(或者它甚至在 beta 2 中发生了变化,不确定),那么上面的答案必须稍微改变一下:

@Component({
selector: "dialog",
templateUrl: "./dialog.component.html"
})
export class DialogComponent {
    constructor(public dialogRef: MdDialogRef<DialogComponent>) { }
    type: string;
    name: string;
    ngOnInit(): void {
        let configData: any = this.dialogRef._containerInstance.dialogConfig.data;
        this.type = configData.type;
        this.name = configData.name;
   }
}

似乎应该有一种更好的方法来引用数据,this.dialogRef._containerInstance.dialogConfig.data但我找不到

于 2017-04-11T19:37:04.153 回答
2

另一种方法是从父组件 DialogComponent中设置值

@Component({
selector: "dialog",
templateUrl: "./dialog.component.html"
})
export class DialogComponent {
    constructor(public dialogRef: MdDialogRef<DialogComponent>) { }
    type: string;
    name: string;
    ngOnInit(): void {

   }
}

父组件

let dialogRef = this.dialog.open(DialogComponent);
dialogRef.componentInstance.type= title;
dialogRef.componentInstance.name= url;
于 2017-04-19T23:38:57.183 回答