我应该如何在 Akita 商店构建我的 Angular 服务?

How should I structure my Angular service with Akita store?

我正在使用 Akita 实体数据存储在 Angular 应用程序的前端缓存数据。

在我的服务中,我有一些类似这样的功能:

setPropertyOfEntity(entityId, newValue): void {
   store.update(entityId, {propertyName: newValue});
   this.saveEntity(store.getEntity(entityId));
}

saveEntity(entity) {
  httpClient.put(url, entity).subscribe((savedEntity) -> {
      store.upsert(savedEntity.id, savedEntity)
  });
}

现在,可以理解的是,随着实体在商店中的更新(属性 已设置,保存后更新插入),Akita 商店会启动大量事件。

我觉得我想在保存后更新商店,以防服务器端逻辑对实体产生副作用(在这种情况下确实会发生)。

像这样保持 FE/BE 同步的秋田方式是什么?

我想我可以从商店中获取实体,为其设置值,然后调用保存函数,但这似乎与 Akita 使用 store.update() 更新属性的方式背道而驰在对象上。

当 Akita 从它的 getEntity() 函数中重新调整不可变变量时,我最终得到了一些感觉不对的东西(assign(),没有使用 akita 内置 store.update())....

setPropertyOfEntity(entityId, newValue): void {
   let storeEntity = store.getEntity(entityId);
   let mutableEntity = Object.assign(new Entity(), storeEntity)
   mutableEntity.property = newValue;
   this.saveEntity(mutableEntity);
}

我知道你说的问题。我认为 Akita 没有针对此类问题的内置解决方案。在我看来,你宁愿有一个架构问题,所有这些方法只更新一个 属性.

假设您有几个函数只更新一个实体 属性,它看起来像这样:

setProperty1OfEntity(entityId, newValue): void {
   let storeEntity = store.getEntity(entityId);
   let mutableEntity = Object.assign(new Entity(), storeEntity)
   mutableEntity.property1 = newValue;
   this.saveEntity(mutableEntity);
}

setProperty2OfEntity(entityId, newValue): void {
   let storeEntity = store.getEntity(entityId);
   let mutableEntity = Object.assign(new Entity(), storeEntity)
   mutableEntity.property2 = newValue;
   this.saveEntity(mutableEntity);
}

setProperty3OfEntity(entityId, newValue): void {
   let storeEntity = store.getEntity(entityId);
   let mutableEntity = Object.assign(new Entity(), storeEntity)
   mutableEntity.property3 = newValue;
   this.saveEntity(mutableEntity);
}

所有这些函数都获取原始实体,然后更新所需的 属性 然后保存 - 其中 4 行代码中的 3 行是重复的,甚至是唯一不同的行 - mutableEntity.property3 = newValue;只是实体字段的另一个名称...

无论这是您用于获取更新实体的自定义解决方案还是内置一个都没有关系,这些功能仍然只是彼此重复。

你怎么解决这个问题?

选项 1:

根据我的经验,很少有这样的函数,它只更新实体的一个 属性,所以我只有一个函数,它接受具有所有更新字段的整个新实体:

save(entityId, newEntityValue: EntityType) { 
  http.post('/url', newEntityValue).subscribe((responseValue) => { 
    store.update(entityId, newEntityValue) // or "responseValue"
  }) 
}

选项 2:

如果您想坚持更新 seprarte 属性,您可以为此编写一个可重用函数:

updateEntity(entityId, partialValue: Partial<EntityType>) {
  const newValue = merge(store.getEntity(entityId), partialValue);
  http.post('/url', newValue)).subscribe((responseValue) => { 
    store.update(entityId, newValue) // or "responseValue"
  }) 
}

其中 merge 是一些用于深度对象合并的函数,就像 lodash 具有的那样。

此解决方案只是一个功能,允许更新任何 属性 甚至多个;