如何订阅afterClosed后的angularMaterial Dialog?

mes*_*lds 8 angular-material angular

关于关闭对话框.https://material.angular.io/components/component/dialog afterClosed不可用吗?

与官方主要文件一样:

在此输入图像描述

错误

Property 'then' does not exist on type '() => Observable<any>'. [default] Checking finished with 1 errors

我试过订阅,但也没办法.

Vad*_*imB 21

基于他们文档的示例部分

let dialogRef = this.dialog.open(DialogResultExampleDialog);

dialogRef.afterClosed().subscribe(result => {
  this.selectedOption = result;
});
Run Code Online (Sandbox Code Playgroud)

但是如果需要,你总是可以将结果转换成承诺

dialogRef.afterClosed().toPromise()
Run Code Online (Sandbox Code Playgroud)

不要忘记添加toPromise支持

import "rxjs/add/operator/toPromise";
Run Code Online (Sandbox Code Playgroud)

  • 看起来在这种情况下,Observable是一个"有限可观察"(在它上面调用`.next()`,然后就是`.complete()`,所以我们不需要取消订阅,根据https://netbasal.com/when-to-unsubscribe-in-angular-d61c6b21bad3 (7认同)
  • 试试这个:`let subscription = dialogRef.afterClosed().subscribe(); subscription.unsubscribe();` (2认同)

小智 16

https://material.angular.io/components/component/dialog

afterClosed方法返回一个Observable,因此它不像Promise对象那样.

为避免在Observable上使用toPromise方法,您可以在第一个事件后使用take(1)自动取消订阅:

dialogRef.afterClosed().take(1).subscribe(result => {
  console.log(`Dialog result: ${result}`); // Pizza!
});
Run Code Online (Sandbox Code Playgroud)

  • 没有必要取消订阅。而内部是一个`Subject&lt;R&gt;`,它立即完成`this._afterClosed.next(this._result); this._afterClosed.complete();` 所以`take(1)` 没有任何用处——但总的来说,这是一个很好的做法,如果你不确定也没有坏处! (4认同)

mus*_*ont 8

No need to unsubscribe from afterClosed() as it auto completes itself: https://github.com/angular/material2/blob/ae41a0ad69ca26c600f0f56c68dd5a1c102d4f1f/src/lib/dialog/dialog-ref.ts#L75

  • 这应该是公认的答案。@VladimirB的答案不正确。 (2认同)