49

对于mdDialog,如何传入变量?具体来说,如何将 Angular 服务注入到对话框组件中?

4

5 回答 5

67

对于传递变量,您可以从 MdDialog.open() 方法调用中返回的 MdDialogRef 实例中获取对话框中打开的组件的实例。

dialogRef = this.dialog.open(PizzaDialog, config)
dialogRef.componentInstance.<property_name>

修改来自github material2 docs angular material doc的 Pizza

@Component({
  selector: 'pizza-component',
  template: `
  <button type="button" (click)="openDialog()">Open dialog</button>
  `
})
export class PizzaComponent {

  constructor(public dialog: MdDialog) { }

  openDialog() {
    let config = new MdDialogConfig();
    let dialogRef:MdDialogRef<PizzaDialog> = this.dialog.open(PizzaDialog, config);
    dialogRef.componentInstance.name = "Ham and Pineapple";
    dialogRef.componentInstance.size = "Large";
  }
}

@Component({
  selector: 'pizza-dialog',
  template: `
  <h2>{{name}}</h2>
  <p>Size: {{size}}</p>
  <button type="button" (click)="dialogRef.close('yes')">Yes</button>
  <button type="button" (click)="dialogRef.close('no')">No</button>
  `
})
export class PizzaDialog {
  name:string;
  size:string;
  constructor(public dialogRef: MdDialogRef<PizzaDialog>) { }
}
于 2016-12-07T10:42:30.767 回答
40

Material2 beta.2

dialog.open()函数采用第二个参数configMdDialogConfig),您可以在其中指定任何data对象。

this.dialog.open(YourComponent, {
  data: {
    anyProperty: "myValue"
  }
});

然后,您可以从用于对话窗口的组件中检索此对象。

export class YourDialogComponent {

  constructor(public dialogRef: MdDialogRef<YourComponent>) {
    console.log('data', this.dialogRef.config.data);
  }
}

更新:beta.3

上面的答案适用于2.0.0-beta.2Material2 的版本。如果您正在使用2.0.0-beta.3,则该config属性已从 中删除MdDialogRefMD_DIALOG_DATA您可以改为使用打开的组件的注入该值。

新的导入语句

import {MdDialog, MdDialogRef, MdDialogConfig, MD_DIALOG_DATA} from '@angular/material';

打开对话框

this.dialog.open(YourComponent, {
  data: {
    anyProperty: "myValue"
  }
});

DialogRef从组件中检索数据

export class YourDialogComponent {

  constructor(
    public dialogRef: MdDialogRef<YourDialogComponent>,
    @Inject(MD_DIALOG_DATA) public data: any) {

    console.log('data', this.data);
  }
}
于 2017-03-06T00:23:12.883 回答
9

来自https://material.angular.io/components/dialog/overview上的官方文档

与 Dialog 组件共享数据。

如果要与对话框共享数据,可以使用 data 选项将信息传递给对话框组件。

let dialogRef = dialog.open(YourDialog, {
  data: 'your data',
});

要访问对话框组件中的数据,您必须使用 MD_DIALOG_DATA 注入令牌:

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

@Component({
  selector: 'your-dialog',
  template: 'passed in {{ data }}',
})

export class YourDialog {
  constructor(@Inject(MD_DIALOG_DATA) public data: any) { }
}
于 2017-06-24T19:50:46.113 回答
7

这就是我的做法。

比萨服务.ts

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

@Injectable()
export class PizzaService {
    getTopping(): string {
        return "Mushrooms"
    }
}

PizzaDialog.component.ts

import { Component } from '@angular/core';
import { MdDialogRef} from '@angular/material';
import {PizzaService} from './pizza.service';

@Component({
    selector: 'pizza-dialog',
    template: `{{pizzaTopping}}
    <button type="button" (click)="dialogRef.close('yes')">Yes</button>
    <button type="button" (click)="dialogRef.close('no')">No</button>
  `,
    providers: [PizzaService]
})
export class PizzaDialog {
    pizzaTopping: string;

    constructor(public dialogRef: MdDialogRef<PizzaDialog>, private pizzaService: PizzaService) { };

    ngOnInit(): void {
        this.pizzaTopping = this.pizzaService.getTopping()
    }
}
于 2016-11-17T15:08:38.863 回答
4

要提供更新的答案以适应从“Md”到“Mat”的更新:

  • 这假设您已经成功实现了一个对话框,现在只是想添加一个输入
  • 当您遇到@angular/material 没有导出成员“MD_DIALOG_DATA”的问题时,这是解决方案

要打开包含数据的对话框,请传入一个数据对象:

this.dialog.open(YourComponent, {
  data: {
    anyProperty: "myValue"
  }
});

要在对话框中检索该数据:

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

export class YourDialogComponent {

  constructor(
    public dialogRef: MatDialogRef<YourDialogComponent>,
    @Inject(MAT_DIALOG_DATA) public data: any) {

    console.log('data passed in is:', this.data);
  }
}
于 2017-11-22T12:54:14.717 回答