NGRX Store - изменения данных на сервере не применяются к состоянию - PullRequest
1 голос
/ 11 февраля 2020

Я работал с NGRX некоторое время, и, наконец, обнаружил проблему, которая мучила меня некоторое время.

По сути: свойства, которые я изменяю на сервере, а затем возвращаются службой в эффекте ngrx, не отображаются как различие в качестве разницы при обновлении хранилища, и поэтому хранилище не обновляется для эти изменения. В моем примере ниже я изменил targetDepth в передней части. Вы увидите в жестком коде, который я сделал, чтобы доказать свою диссертацию, я ожидаю, что магазин обновит и targetDepth, и targetWidth.

Redux State Я жестко закодировал измените метод,

 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

...