web-dev-qa-db-ja.com

Angular Materialダイアログにサービス変数を渡すにはどうすればよいですか?

mdDialog の場合、変数を渡すにはどうすればよいですか?具体的には、Angularサービスをダイアログコンポーネントに挿入する方法は?

38
ethan

変数を渡すには、ダイアログで開かれたコンポーネントのインスタンスを、MdDialog.open()メソッド呼び出しで返されたMdDialogRefインスタンスから取得できます。

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

github material2 docs からの変更されたピザ

@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>) { }
}
55
poidar

Material2 beta.2

dialog.open()関数は、2番目のパラメーター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

上記の答えは、Material_2の2.0.0-beta.2バージョンで機能します。 2.0.0-beta.3を使用している場合、configプロパティはMdDialogRefから削除されました。代わりに、開いているコンポーネントのMD_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);
  }
}
39
ThiagoPXP

https://material.angular.io/components/dialog/overview にある公式ドキュメントから

Dialogコンポーネントでデータを共有します。

ダイアログとデータを共有する場合は、データオプションを使用して、ダイアログコンポーネントに情報を渡すことができます。

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) { }
}
9
Flavien Volken

ここに私がそれをした方法があります。

pizza.service.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()
    }
}
5
camden_kid

「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);
  }
}
3