我遇到一个奇怪的问题。我正在为我的应用程序使用批量编辑功能。每当用户更新字段时,我的表单就会自动保存。一旦自动保存事件触发,我就会遍历一组类似的用户选择记录集,以在那里进行相同的更改。
例如,我可能为计划{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);
}