Где должен быть создан / назначен «идентификатор» нового объекта данных? - PullRequest
0 голосов
/ 13 февраля 2019

Я создаю веб-приложение с использованием Angular 7 и хочу использовать @ ngrx / store и @ ngrx / Effects.

Отказ от ответственности: я новичок в этих технологиях.

В типичном клиент-серверном приложении я думаю, что имеет смысл разрешить базе данных назначать значение идентификатора, которое затем передается обратно клиенту в ответе HTTP.

Но, учитывая, что вызовы APIдолжен происходить с побочными эффектами при использовании NGRX, как правильно обновить новый объект в состоянии с идентификатором, возвращенным в ответе http?

Насколько я понимаю, побочные эффекты не должны манипулировать состоянием.Вот и вся причина, по которой их называют побочными эффектами.

Как правильно решить эту проблему?

1 Ответ

0 голосов
/ 13 февраля 2019

Некоторые возможности:

  • Вы можете позволить клиенту создавать свои собственные идентификаторы.
  • Вы можете добавлять объекты в хранилище только после завершения обхода сервера.Это можно сделать, вернув весь объект обратно с сервера, или добавить идентификатор к объекту в результате:
@Effect()
  save = this.actions.pipe(
    ofType(Foo),
    exhaustMap(({ payload }) =>
      this.service.post(payload).pipe(
        map(
          result =>
            new FooSuccess({
              ...payload,
              id: result,
            })
        ),
        catchError(() => of(new FooFailed()))
      )
    )
  );
  • Манипуляции с состояниями действительно выполняются через редукторы, еслиВы можете каким-то образом связать новый объект в хранилище с возвращенной полезной нагрузкой. Вы можете обновить идентификатор с помощью редуктора.
@Effect()
  save = this.actions.pipe(
    ofType(Foo),
    exhaustMap(({ payload }) =>
      this.service.post(payload).pipe(
        map(
          result =>
            new FooSuccess({
              reference: payload.reference,
              id: result,
            })
        ),
        catchError(() => of(new FooFailed()))
      )
    )
  );


// and in the reducer

return {
   ...state, 
   // mutate found entity, else just return the entity in the store
   entities: this.state.entities.map(p => p.reference === action.reference ? mutateEntityHere : p)
}

Моими предпочтениями будет либо первый, либо второй вариант.

...