angular ngrx store as identity map

时间:2017-11-22 07:45:06

标签: angular ngrx ngrx-store

我创建了一个简单的IdentityMapService,每当我从API获取数据时,我都会更新身份映射,并根据以下2个类将身份映射的返回值映射回API中的数据。

// identity-map.service.ts
import { Injectable } from '@angular/core';

@Injectable()
export class IdentityMapService {

  _identityMap = {};

  map(className, object) {
    if (object) {
      var mappedObject;
      if (this._identityMap[className]) {
        mappedObject = this._identityMap[className][object.id];
        if (mappedObject) {
          Object.assign(mappedObject, object);
        } else {
          this._identityMap[className][object.id] = object;
          mappedObject = object;
        }
      } else {
        this._identityMap[className] = {};
        this._identityMap[className][object.id] = object;
        mappedObject = object;
      }
      return mappedObject;
    }
  }

}

// item-api.service.ts
@Injectable()
export class ItemApiService {

  constructor(private api: ApiService, private identityMap: IdentityMapService) {
  }

  getList(page = 1, filter?: any, include?: any) {
    return this.api.get('/items', { page, filter, include })
      .pipe(map(response => {

        response.data = response.data.map(item => {
          return this.identityMap.map('item', item);
        });

        return response;
      }));
  }

  get(id, include?: any) {
    return this.api.get('/items/' + id, { include })
      .pipe(map(response => {

        response.data = this.identityMap.map('item', response.data);

        return response;
      }));
  }

}

有没有办法在NGRX中实现这一目标?我可能有几个不同的视图,它们以不同的方式同时显示列表项或单个项目,并且要确保如果我更新任何视图中的项目,它将在所有视图中更新其他观点。在这个阶段,我想不出另一种方法来完成我正在做的过程,即在需要时获取数据,更新该数据的所有其他实例。

0 个答案:

没有答案