代码之家  ›  专栏  ›  技术社区  ›  ldgorman

在后端定义相关id时,如何为实体适配器定义selectId?

  •  0
  • ldgorman  · 技术社区  · 6 年前

    我正在我的存储上调度upsert操作/reducer以将新记录添加到state中,并且有一个效果将调用后端并将记录/文档添加到我的mongodb实例中。

    假设在创建文档时,这个特定模型唯一合理的id是由后端逻辑定义的,那么我应该如何在前端的实体实现中定义selectId?

    在将项添加到状态时 id: undefined 我得到警告:

    entity.js:76@ngrx/entity:传递给 selectId 实现返回未定义。你应该提供你的 拥有 选择ID 实施。

    我的适配器定义为:

    export const adapter: EntityAdapter<PublishedData> = createEntityAdapter<
      PublishedData
    >({ selectId: (publishedData: PublishedData) => publishedData.doi });
    

    相关影响是:

    @Effect()
      UpsertPublishedData$ = this.actions$.pipe(
        ofType<UpsertPublishedData>(PublishedDataActionTypes.UpsertPublishedData),
        switchMap(action => this.publishedDataApi.create(action.payload.publishedData)
        .pipe(mergeMap((data: PublishedData) => [ new UpsertPublishedData({ publishedData: data }),
          this.publishedDataApi.register(data[0].doi)]),
        catchError(err => of(new FailedPublishedDataAction(err)))))
      );
    

    publishedData.doi 是我需要用来引用实体的违规字段。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Thierry Falvo    6 年前

    在这种情况下,我将考虑两种选择:

    • 选项1:实现悲观的创建(保持简单)

    当用户创建新记录时,例如 AddRecord 调用 POST 请求后端api。成功的响应发出一个新动作 AddRecordSuccess 添加新创建的记录(使用 id 通过后端发送)到存储 @ngrx/entity .

    在创建过程中(请求到后端),应该显示一个加载器指示器来通知用户。

    • 选项2:实现乐观的创建(为了更好的用户体验)

    如果乐观的更新确实是一个需要或目标,那么可以是暂时的或永久的 身份证件 由前端应用生成:

    • 暂时的 身份证件 在存储区内用于管理要同步的实体。当后端创建实体时 身份证件 应该由永久后端更新或完成 身份证件 .

    • 永久的 身份证件 可以由前端(例如UUID)生成,并发送到 由后端使用。

    不管怎样, @ngrx/实体 number string )识别和管理商店中的实体。

    希望有帮助。

        2
  •  1
  •   ldgorman    6 年前

    目前,我已经修改了reducer,使其在第一次传递时不将记录添加到state,其中id字段(doi)是未定义的。

    case PublishedDataActionTypes.UpsertWaitPublishedData: {
      if (action.payload.publishedData && action.payload.publishedData.doi) {
        return adapter.upsertOne(action.payload.publishedData, state);
      }
      return state;
    }
    

    从这开始:

      case PublishedDataActionTypes.UpsertPublishedData: {
          return adapter.upsertOne(action.payload.publishedData, state);
        }
    

    这样可以确保状态记录与数据库中的状态匹配。这种方法仍然与实体方法保持一致,即 UpsertPublishedDataSuccess 需要操作。

        3
  •  0
  •   yido    5 年前

    如果您正在讨论ngrx/entity,那么在创建EntityAdapter时只需指定selectId方法。 see for more info: createentityadapter

     dexport const adapter: EntityAdapter<Location > = createEntityAdapter<Location>({
      selectId: (location: Location) => location.locationid,
    });
    
    推荐文章