Angular请求忽略了HttpPatch

时间:2018-11-14 21:14:26

标签: angular typescript odata

我遇到一个奇怪的问题。我正在为我的应用程序使用批量编辑功能。每当用户更新字段时,我的表单就会自动保存。一旦自动保存事件触发,我就会遍历一组类似的用户选择记录集,以在那里进行相同的更改。

例如,我可能为计划{id:4}加载了表单,但还希望将编辑应用于ID为2、3、7、10的记录。因此,可以说我将projectName字段更改为“一个伟大的项目”。我期望的结果是将所有五个记录更新为projectname字段为“ A great Project”。

但是,即使我遍历每条记录,我也只打过一次服务,这就是原始计划(在我的示例4中)。其他一切都消失了。我仍然可以看到状态的变化,并且可以一直跟踪它们。

这是我在容器/组件上输入事件后保存的内容

autoSave(save: {changes: Plan, field: string, value: any}) {

  this.planContext.getEnabled().forEach(x => {
    x.plan[save.field] = save.value;
    console.info(x.plan);
    this.autoSavePlan(x.plan, x.plan.id);
  });
}

autoSavePlan(changes: Plan, id: number) {
   this.store.dispatch(new PlanActions.Edit({ plan: { id: id, changes: changes } }));
}

我有以下效果

  @Effect()
  editPlan$: Observable<Action> = this.actions$
    .ofType<Edit>(PlanActionTypes.Edit).pipe(
      switchMap(action => this.planService.editPlan(action.payload.plan)),   //Last Line of code for server break point for failing records.
      map((plan: any) => {
        console.log(plan);
        return new EditSuccess({ id: plan.id, changes: plan});
      }),
      catchError(err => {
        toastr.error(`An error has occurred. Please reload the page before making any other changes.`); 
        console.error(err);
        return of(new EditFail(err));
      })
    );

服务电话:

editPlan(plan: Update<Plan>) : Observable<Plan> {
    this.log("Editing a Plan");

    return this.http.patch<Plan>(this.odataUrl + "Plans(" + plan.id + ")", plan.changes, this.httpPatchOptions);
  }

PlansController

[Authorize]
public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<Plan> plan)
{
//Breakpoint hit only once
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
 //... do stuff
}

EDIT1

用户故事:    作为用户,我希望能够一次编辑多个计划。我应该能够使用单个值更新计划字段,并将该更改也应用于我为批量编辑选择的其他计划记录。

预期结果: 我更新表单中的字段。我应该为每个选择的计划看到一个服务电话,并证明所做的更改已应用于所有计划。

当前结果: 我经历了为每个计划提交httppatch的循环。我只看到其中一个应用了更改。如果我尝试通过断点遵循代码,最终我会碰到F10,Chrome调试器会丢失其中一个计划的上下文。这始终是我列表中的plast计划。没有记录错误,没有任何指示。同样,我的服务上的断点只会触发一次。

EDIT2

将以上内容保留为背景。我最初的问题是我思考可观察物的方式中的一个基本问题。因为我在autosave函数中更新了可观察对象四次,所以订阅它的任何东西都无法按我预期的那样工作是有道理的。众所周知,您只会得到最新的对象。这就是为什么只有一个更新调用会发生的原因。

修补后,我可以使用Update []重新创建上述所有方法。解决了部分问题。

这可以按预期工作,但不能满足我的用户要求:

editBulkPlan(plans: Update<Plan>[]): Observable<Plan> {  

    var y = this.http.patch<Plan>(this.odataUrl + "Plans(" + plans[1].id + ")", plans[1].changes, this.httpPatchOptions);

    return y;

    //return this.http.patch<Plan[]>(this.odataUrl + "Plans(" + plan.id + ")", plans.changes, this.httpPatchOptions);
  }

这不起作用。我希望看到两个服务电话。永远不会调用该服务。我什至从未在PlanController中达到断点。

editBulkPlan(plans: Update<Plan>[]): Observable<Plan> {  

        var x = this.http.patch<Plan>(this.odataUrl + "Plans(" + plans[0].id + ")", plans[0].changes, this.httpPatchOptions);
        var y = this.http.patch<Plan>(this.odataUrl + "Plans(" + plans[1].id + ")", plans[1].changes, this.httpPatchOptions);

        return y;

        //return this.http.patch<Plan[]>(this.odataUrl + "Plans(" + plan.id + ")", plans.changes, this.httpPatchOptions);
      }

0 个答案:

没有答案