You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular12如何从Angular Material Dialog获取返回值到外部服务

问题原因

dialogRef.afterClosed() 是异步可观察对象,你原有的 dialogResult() 方法没有返回任何值,同时你在 update 方法中用同步逻辑判断异步方法的返回值,此时弹窗还没关闭、订阅逻辑还没触发,自然拿不到返回的result值。

修复步骤

1. 调整ModalResultService代码

不要在服务内部直接订阅afterClosed,直接将该可观察对象返回,交给调用方处理:

import { Injectable } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { ModalComponent } from '../modal/modal.component';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class ModalResultService {
  param!:string 

  constructor(public dialog: MatDialog) { }

  // 直接返回弹窗关闭的可观察对象,泛型可根据你弹窗返回的result实际类型调整
  dialogResult(): Observable<string | undefined> {
    const dialogRef = this.dialog.open(ModalComponent);
    return dialogRef.afterClosed();
  }
}

2. 调整update方法的异步逻辑

使用RxJS的switchMap操作符串联弹窗结果判断和后续请求逻辑,保证异步流程按顺序执行:

import { of } from 'rxjs';
import { switchMap } from 'rxjs/operators';

// ...其余原有代码不变
update(note: Notation): Observable<Notation> {
  return this.res.dialogResult().pipe(
    switchMap(result => {
      // 此处根据你的业务需求调整result的判断条件,比如判断是否为true、是否非空等
      if (result) {
        return this.http.patch<Notation>(`${environment.fbDbUrl}/posts/${note.id}.json`, note);
      }
      return of(this.dNotation);
    })
  )
}
使用说明

修改后的update方法依然返回Observable<Notation>,你在组件中调用该方法时,正常订阅即可拿到最终结果,和原有调用逻辑保持一致。


内容的提问来源于stack exchange,提问作者Vladimir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:27:04