es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo actualizar la fuente de datos de una mat-table después de eliminar un elemento a través de un mat-dialog

Me gustaría actualizar los elementos mostrados en una mat-table después de eliminar un elemento, sin acceder nuevamente al servidor. Funciona bien si elimino el elemento directamente desde el botón de eliminar en una fila, pero no funciona cuando uso un mat-dialog.

Aquí está mi código haciendo directamente (esto funciona):

HTML:

<button mat-button="" (click)="delete(element)"></button>

TS:

public delete(element) {
  this.myService.delete(element.ID).then(() => {
    const index = this.dataSource.data.findIndex(q => q.ID == element.ID);
    this.dataSource.data.splice(index, 1);
  })
}

Y aquí está mi código utilizando mat-dialog, donde no se actualiza la tabla:

HTML:

<button mat-button="" (click)="openDialog(element)"></button>

TS:

public openDialog(element) {
  const dialogRef = this.dialog.open(DeleteItemDialogComponent, {
    panelClass: ['backOfficeDialog'],
    data: {itemType: 'Document'}
  });
  dialogRef.afterClosed().subscribe(response => {
    if (response.event == 'Delete') {
      this.delete(element);
    }
  });
}

public delete(element) {
  this.myService.delete(element.ID).then(() => {
    const index = this.dataSource.data.findIndex(q => q.ID == element.ID);
    this.dataSource.data.splice(index, 1);
  })
}

MatDialogItem:

export class DeleteItemDialogComponent implements OnInit {

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

  ngOnInit() {
  }

  public delete() {
    this.dialogRef.close({event: 'Delete'});
  }

  closeDialog() {
    this.dialogRef.close({event: 'Cancel'});
  }
}

¿Sabes por qué en el segundo caso no se actualiza la tabla, qué estoy haciendo mal y cómo solucionarlo?

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con el alcance de “this” en tu código. Cuando llamas a “this.delete(element)” dentro del método subscribe del mat-dialog, “this” está haciendo referencia al componente MatDialog en lugar del componente donde se encuentra la tabla.

    Una forma de solucionar esto es enlazar el contexto de “this” a tu método delete en el constructor de tu componente:

    constructor(...) {
      ...
      this.delete = this.delete.bind(this);
    }
    

    Alternativamente, en lugar de llamar al método “delete” dentro del método subscribe, puedes emitir un evento desde el componente mat-dialog y manejarlo en el componente donde se encuentra la tabla.

    Para hacer eso, puedes definir un evento de salida en tu componente mat-dialog y emitirlo cuando el usuario haga clic en el botón de eliminar:

    @Output() onDelete = new EventEmitter();
    
    ...
    
    public delete() {
      this.onDelete.emit();
      this.dialogRef.close({event: 'Delete'});
    }
    

    Luego, en el componente donde se encuentra la tabla, puedes escuchar este evento y actualizar los datos:

    <app-delete-item-dialog (ondelete)="refreshTable()"></app-delete-item-dialog>
    
    ...
    
    public refreshTable() {
      this.dataSource.data = [...this.dataSource.data]; // clonar el arreglo de datos para desencadenar una actualización
    }
    

    ¡Espero que esto ayude!

Comments are closed.