2

在我的代码中,我有一个按钮,它将浏览数据列表并mat-dialog为每个数据打开一个。

不幸的是,在循环过程中,全部mat-dialogs打开。

我想要发生的是,通过使用该dialogRef.afterClosed()方法,取决于结果(true)下一个mat-dialog打开或(false)循环结束。

openDialog(): void {
  this.data.forEach(data => {
    const dialogRef = this.dialog.open(DialogOverviewExampleDialog, {
      disableClose: true
    });
    dialogRef.componentInstance.data = data;

    dialogRef.afterClosed().subscribe(result => {
      if (result) {
        // open next mat-dialog
      } else {
        // stop loop
      }
    });
  });
}

<div mat-dialog-actions>
  <button mat-button (click)="_dialogRef.close(true)">Ok</button>
  <button mat-button (click)="_dialogRef.close(false)">Cancel</button>
</div>

StackBlitz 这里

我怎样才能做到这一点?我不知道该怎么做。

谢谢你的帮助。

4

3 回答 3

2

您可以通过将您的方法标记为async并等待您的对话afterClosed()调用来实现此目的,但由于await仅适用于您需要ObservablePromise.

这是一个适合我的解决方案

@Component({
  selector: "dialog-overview-example",
  templateUrl: "dialog-overview-example.html",
  styleUrls: ["dialog-overview-example.css"]
})
export class DialogOverviewExample {
  data: any[] = DATA;
  constructor(public dialog: MatDialog) {}

  async openDialog() {

  for(var i =0; i < this.data.length; i++) {
    const dialogRef = this.dialog.open(DialogOverviewExampleDialog, {
        disableClose: true
      });
      dialogRef.componentInstance.data = this.data[i];
      var result = await  dialogRef.afterClosed().toPromise();
        if (!result) {
          console.log("Stop loop", result);
          break;
        }
        // else continue the loop

   }
 }
}

Stackblitz 工作演示

于 2020-10-21T09:16:31.067 回答
2

你可以通过 rxjs takeWhile 来实现

from(this.data)
      .pipe(
        concatMap(x => {
          const dialogRef = this.dialog.open(DialogOverviewExampleDialog, {
            disableClose: true
          });

          dialogRef.componentInstance.data = x;

          return dialogRef.afterClosed();
        }),
        takeWhile(Boolean)
      ).subscribe();

请参阅https://stackblitz.com/edit/open-mat-dialogs-one-by-one-after-the-previous-one-is-cl-yqprmt?file=src/app/dialog-overview-example.ts

于 2020-10-21T09:22:03.473 回答
0

我建议不要使用迭代器(foreach)(事实上,我不鼓励使用),而是openDialog如果还有更多数据要显示(类似队列的方法),则在订阅中再次触发。当然,这需要从列表中删除显示的数据,但同时也允许将新数据附加到列表中。

于 2020-10-21T09:17:53.723 回答