新数据对象的“ id”应该在哪里创建/分配?

时间:2019-02-12 23:35:05

标签: ngrx angular7 ngrx-store ngrx-effects

我正在使用Angular 7构建Web应用程序,并希望使用@ ngrx / store和@ ngrx / effects。

免责声明:我是这些技术的新手。

在典型的客户端-服务器应用程序中,我认为允许数据库分配id值是有意义的,然后将其在HTTP响应中传递回客户端。

但是,考虑到使用NGRX时API调用应该会产生副作用,用http响应中返回的ID更新处于状态的新对象的正确方法是什么?

我的理解是副作用不应该操纵状态。这就是它们被称为副作用的全部原因。

解决此问题的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

一些可能性:

  • 您可以让客户端在其中生成自己的ID。
  • 您只能在服务器往返完成后将实体添加到存储中。 这可以通过从服务器返回整个对象或将id附加到实体中来实现:
@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()))
      )
    )
  );
  • 状态操作确实是通过化简器完成的,如果您可以某种方式将商店中的新实体与返回的有效负载进行链接,则可以通过化简器来更新ID
@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)
}

我的偏好设置是第一个或第二个选项。