Angular 多个 HTTP post 到同一个 API 具有不同的请求正文发送相同的请求

Angular multiple HTTP posts to same API with different request body sends the same request

我有几个居民护理计划图,我为每个图使用相同的组件,调用相同的 API,但输入数据不同。我在 parent 组件中有一个日期选择器,当这个日期更新时,我想更新所有图表。每个图形组件都应调用具有相同日期和不同 ID 的 API,但调用都是平等的。

我有一个 parent 组件,在 *ngFor:

上有 children 个组件
<div *ngFor="let data of selectedItems">
    <app-care-plan-graph 
        [careData]="data" 
        [dateInput]="dateInput">
    </app-care-plan-graph>
</div>

我从每个 CarePlanGraphComponent 进行 API post 调用:

  @Input() careData: {careAdlId:any};
  @Input() dateInput: GetAdlEventRequest;
  constructor(private residentService: ResidentService) { }
  ngOnInit() {
    this.getAdlEvents(this.dateInput);
  }
  getAdlEvents(body: GetAdlEventRequest) {
    body.careAdlId = this.careData.careAdlId;
    console.log("calling get adl events: ", body);
    this.residentService.getAdlEvents(body).then((response: ApiResponseModel) => {
      // handle response
    })
  }

服务调用是普通的httppost:

  getAdlEvents(body): Observable<any> {
    return this.http.post(this.residentsBaseUrl + 'getAdlEvents', body);
  }

在 parent 组件上,我使用 ViewChildren 访问 carePlanGraph 组件并在视图更新时调用方法 getAdlEvents()

  @ViewChildren(CarePlanGraphComponent) graphComponents: QueryList<any>;
.
.
.
  ngOnInit() {
    this.form.valueChanges.subscribe(data => {
      this.dateInput= {
        startDate: data.startDate,
        endDate: data.endDate
      };
      this.graphComponents.forEach(element => {
        element.getAdlEvents(this.selectedInputs);
      });
    })
  }

在生成 API post 之前,在 console.log 之前一切正常,但是 post 始终使用相同的请求主体生成,无论控制台日志显示它有不同的 ID。 我可以在网络选项卡中看到有效负载相同,这里有一些示例图像,在控制台中你可以看到有两个不同的主体,一个 ID 为 60,另一个 ID 为 61,但两者都 API post 是用 ID 为 61 的有效载荷制作的: 第一个有效载荷: 1st payload

第二个有效载荷: 2nd payload

任何帮助理解这个问题的帮助将不胜感激,现在我将把 Api post 移动到 parent 组件并使用 concatMap 以便 post 按顺序制作,并将数据传递给 children,但我真的很想了解为什么这种方式不起作用。

发生这种情况的原因是您实际上是在用同一个主体调用请求。

Javascript 中的对象作为对相同对象的引用传递。

由于您将对象作为主体传递给第一个 Graph 中的 API 调用,然后在第二个 Graph 中修改同一对象,因此会产生相同的 api 调用。

您能做的最好的事情就是在每次拨打电话时复制正文请求。这很容易通过扩展运算符 (...) 实现。

  getAdlEvents(body: GetAdlEventRequest) {
    // copy the body and add care id
    body = {...body, careAdlId: this.careData.careAdlId};
    console.log("calling get adl events: ", body);
    this.residentService.getAdlEvents(body).then((response: ApiResponseModel) => {
      // handle response
    })
  }