Я работал с 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}
и пропустив ее. Затем хранилище обновляется только значениями с сервера, но каким-то образом пропускает изменения, сделанные в пользовательском интерфейсе. Говоря иначе, если я делаю это, targetWidth
обновляется, но не targetDepth
. Мне нравятся оба, но я не уверен, что мне не хватает. Спасибо.
Редактировать : Я готов поделиться большим количеством битов, но не хочу предоставлять постороннюю информацию
Edit2 Соответствующий редуктор
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