Angular Material Dialog: How to update the injected data when they change in the parent component? Angular Material Dialog: How to update the injected data when they change in the parent component? angular angular

Angular Material Dialog: How to update the injected data when they change in the parent component?


You can just change data of the component instance, like this:

this.dialogRef.componentInstance.data = {numbers: value};

Example here:https://stackblitz.com/edit/angular-dialog-update


There are 2 ways I can think of at the moment, I don't really like either, but hey...

Both ways involve sending an observable to the dialog through the data.

  1. You could pass on the observable of the part to the part component, and then pass the observable in the data to the dialog. The dialog could then subscribe to the observable and get the updates that way.

AreaComponent

@Component({  selector: 'app-area',  template: '<app-part *ngFor="let part of planAsync$ | async; i as index" [partData]="part" [part$]="part$(index)"></app-part>'})export class AreaComponent {  plan = [];  constructor(private wampService: WampService) {  }  part$(index) {    return this.planAsync$      .map(plan => plan[index]);  }  get planAsync$() {    return this.wampService      .topic('sendplan')      .map(res => {        let tm = new TableMap();        return tm.tableToMap(res.argskw).filter((m) => m.area === 1);      });  }}

Part Component

@Component({  selector: 'app-part-details',  templateUrl: './part.component.html'})export class PartComponent {  @Input() partData: any;  @Input() part$  constructor(public dialog: MatDialog) {}  openDetailsDialog(): void {    let dialogRef = this.dialog.open(PartDetailsDialogComponent, {      width: '650px',      height: '400px',      data: {        partData: this.partData,        part$: this.part$      }    });  }}

Of course the question then is how useful it is to even pass partData along, if you could just access the data directly anyway.

  1. The other way requires you to just modify the part component, but you'll have to create a subject that you feed the changes to part that the component receives. I don't really like making subjects, especially if the data is already originally coming from an observable, but whatever:

Part Component

@Component({  selector: 'app-part-details',  templateUrl: './part.component.html'})export class PartComponent, OnChanges {  @Input() partData: any;  private Subject part$ = new Subject();  constructor(public dialog: MatDialog) {}  ngOnChanges(changes){    this.part$.next(changes['partData']);      }  openDetailsDialog(): void {    let dialogRef = this.dialog.open(PartDetailsDialogComponent, {      width: '650px',      height: '400px',      data: {        partData: this.partData,        part$: this.part$      }    });  }}

finally, to access the data, you could change the html to

Dialog HTML

<div *ngIf="(data.part$ | async) as part">  <h1 mat-dialog-title>Part Details for Nr. {{ part.partNr }}</h1>  <div mat-dialog-content>    <div>Current speed details: {{ part.speed }}</div>  </div>  <div mat-dialog-actions>    <button mat-button (click)="onNoClick()">Cancel</button>    <button mat-button [mat-dialog-close]="data.animal" cdkFocusInitial>Ok</button>  </div></div>

Or you could subscribe the to observable in the dialog component, and provide the data from there


One component is hosting a dialog.If the component data is changed then the dialog data also should change.For this, first answer by Penghui is working.

In case if that dialog has to do some action based on the data change, there is no (event) trigger telling that dialog data has been changed.

for this the solution is (It will work for this question also):

Step 1: declare class variable dialogRef: MatDialogRef

step2: in Dialog component crate a method xMethod()

step3: keep the dialog reference assigned to this.dialogRef

step4: whenever hosting component wants to change dialog-data use below lines in the component:

  if (this.dialogRef  && this.dialogRef.componentInstance) {       this.dialogRef.componentInstance.xMethod( data);  }

step5: check xMethod() in dialog is called and write anything you want to do on the data change event from the component.

pls check this working code:

https://stackblitz.com/edit/angular-arvuho?embed=1&file=src/app/app.component.ts