1

我正在使用 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 同步的秋田方式是什么?

我想我可以从商店中获取实体,为其设置值,然后调用 save 函数,但这似乎与 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);
}
4

1 回答 1

1

我得到了你说的问题。我不认为秋田有任何内置的解决方案来解决这些问题。在我看来,您宁愿对所有这些仅更新一个属性的方法存在架构问题。

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

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:

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

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

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

于 2021-05-07T16:55:23.180 回答