我已经和NGRX
一起工作了一段时间,最后发现了困扰我一段时间的问题。
本质上:我在服务器上更改的属性,然后由服务以ngrx效果返回的属性,在更新存储时未显示为差异,因此不会针对这些更改更新存储。在下面的示例中,我在前端更改了targetDepth
。您会在硬编码中看到我确实证明了自己的命题,我希望商店会同时更新targetDepth
和targetWidth
。
public async Task<IActionResult> Patch([FromODataUri]int key, [FromBody] PlanDTO expPlan)
{
//DO a bunch of stuff
//Save & error handling
var result = GetPlan(key);
result.FirstOrDefault().TargetWidth++; //Dummy code for testing, not real logic
return new ObjectResult(result); //Return saved value
}
我的作用在这里:
@Effect()
editPlan$: Observable<Action> = this.actions$
.pipe(ofType<Edit>(PlanActionTypes.Edit),
switchMap(action => this.planService.editPlan(action.payload)),
map((plan: any) => {
// var changes = {...plan} //--This line changes the behavior entirely
return new EditSuccess({ id: plan.id, changes: plan});
}),
catchError(err => {
this.toastr.error(`An error has occurred. Please reload the page before making any other changes.`);
console.error(err);
return of(new EditFail(err));
})
);
我可以通过添加var changes = {...plan}
并将其传递给新问题。然后,仅使用服务器中的值更新存储,但是以某种方式跳过了UI中所做的更改。换句话说,如果我这样做,targetWidth
会更新,但不会更新targetDepth
。我都喜欢,但我不确定我缺少什么。谢谢。
编辑:我愿意分享更多的信息,但不想提供无关的信息
Edit2 相关的reducer
export function reducer(
state = fromState.initialState,
action: PlanActionsUnion
): State {
switch (action.type) {
case PlanActionTypes.EditSuccess: {
return adapter.updateOne(action.payload, state);
}
}
Edit3 意外行为修复。我不明白为什么。
预先更改服务以枚举IQueryable的结果似乎可以解决问题。
var result = GetPlan(key);
var resultFirst = result.FirstOrDefault();
var resultFirst.targetWidth++;
return new ObjectResult(resultFirst); //Return saved value