【问题标题】:How to add object to the existing dynamic Akita store which contains Array using angular如何使用角度将对象添加到包含 Array 的现有动态秋田商店
【发布时间】:2020-07-23 17:32:14
【问题描述】:

我在 Akita 商店中存储动态值而不创建模型。

我正在尝试将对象从存储添加到现有数组,我是秋田新手,因此尝试深度克隆秋田存储值,然后将该对象推送到数组并将更改后的数组再次设置为存储,但它复制了存储中的值

updatestore(data) {
  var _res = _.cloneDeep(this.GetState());
  _res[1].geography.data.push(data);
  this.gStore.destroy();
  this.gStore.set(_res);
  this.GetState();
}

我转载于stackblitz

【问题讨论】:

    标签: angular state-management angular-akita akita


    【解决方案1】:

    秋田为我们提供了两种类型的商店:

    • 可以保存任何形状的数据

      的基本存储
    • 表示实体集合的实体存储。

    实体商店

    您选择了第二个选项(这是您的地理收藏的正确选择)并创建了基于实体的商店。现在您需要向 Akita 商店提供 一个集合,但您提供的是整个 json 对象。秋田尝试将此对象转换为实体数组,但创建了错误的数组。

    set()

    用提供的集合替换当前集合,并重置 活跃的实体

    取自Akita docs

    您应该做的是将一个数组传递给EntityStore.set 方法

    this.serv.SetState(data['data'].geography.data)
    

    然后简单地调用 EntityStore.add 方法以向您的集合中再添加一项:

    this.gStore.add(data);
    

    Forked Stackblitz Akita Entity store


    基本商店

    如果您不想使用方便的 EntityStore,那么您可以实现基本存储:

    import { Store, StoreConfig } from '@datorama/akita';
    
    export class GeoStore extends Store<IGeoState> {
       ...
    

    只有这样你才能像你描述的那样使用Store.update方法更新商店

    var _res = _.cloneDeep(this.GetState());
    _res.data.geography.data.push(data);
    
    this.gStore.update(_res);
    

    Forked Stackblitz Akita basic

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 2020-10-26
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多