javascript - 如何更新或删除 ngrx 实体中的嵌套对象?

标签 javascript angular rxjs ngrx ngrx-entity

如何更新或删除 ngrx 实体内的嵌套对象 例如,我想从 (charter.entities.scopes.data) 中删除第一个具有 19 id 的元素,如下面存储在我的 ngrx 存储中的 json 对象所示

 charter: {
      ids: [
        1
      ],
      entities: {
        '1': {
          id: 1,
          projectName: 'Some Project',
          projectCode: '899',
          projectUniqueCode: '674a9596-50ee',
          projectStatus: 'construction',
          budgetCode: 'CC34',
          projectTypeOne: 'Goods',
          projectTypeTwo: 'New',
          donorName: 'Elza Hills',
          scopes: {
            data: [
              {
                id: 19,
                module: 'Miss Cassandra Cartwright I',
                description: 'In tempore quia asperiores aut ea cum optio minima nemo est et aspernatur est repudiandae voluptas ipsum.',
                time: '2018-01-23 15:37:36'
              },

              {
                id: 43,
                module: 'Leanne Douglas',
                description: 'Occaecati facere eligendi esse esse nostrum in et vitae assumenda molestias omnis quis sit qui aut omnis est.',
                time: '2018-01-23 15:37:36'
              },
            ]
          },
          assumptions: {
            data: [
              {
                id: 29,
                assumption: 'Doloremque quo nihil minima ad optio perspiciatis asperiores debitis mollitia at debitis porro quia nam accusantium illo consequatur labore cum.',
                comments: 'Inventore ut pariatur id laboriosam recusandae soluta quo sunt impedit aut velit.'
              },
              {
                id: 164,
                assumption: 'Dolores quam aut possimus sint fugiat natus quos quaerat saepe facilis harum molestiae.',
                comments: 'Cumque quis magni illo dolore quas nam officiis dolores enim soluta doloribus in sed eum ut sunt.'
              },
            ]
          },

reducer

export interface State extends EntityState<ProjectsCharter> {
  isLoading: boolean;
  isLoaded: boolean;
  selectedProjectsId: any;
}

export const adapter: EntityAdapter<ProjectsCharter> = createEntityAdapter({
  selectId: (state: ProjectsCharter) => state.id,
  sortComparer: false
});

export const initialState = adapter.getInitialState({
  isLoading: false,
  isLoaded: false,
  selectedProjectsId: null
});

export function reducer(state = initialState, action: CharterActions) {
  switch (action.type) {
    case CharterActionTypes.loadCharterSuccess:
      return {
        ...adapter.addOne(action.payload['data'], state),
        isLoading: false,
        isLoaded: true
      };
    case CharterActionTypes.updateScopeOnParent:
      const scopeEntity = { ...state.entities[action.payload.param] };
      scopeEntity.scopes.data = scopeEntity.scopes.data.map(item => {
        if (item.id === action.payload.id) {
          item.module = action.payload.module;
        }
        return item;
      });

      return {
        ...adapter.updateOne(scopeEntity, state)
      };
    default:
      return {
        ...state
      };
  }
}

我可以用这个 reducer 更新和修改 nestad 对象,但问题是 1 - 它有点复杂,而且在编译时在终端中显示 error TS2339: Property 'map' does not exist on type 'Scope'.还有Argument of type '{ id: string; projectName: string; projectStatus: string; projectCode: string; projectUniqueCode:...' is not assignable to parameter of type 'Update<ProjectsCharter>'.

最佳答案

我强烈建议您更改商店并使其正常化。看这里:https://redux.js.org/docs/recipes/reducers/NormalizingStateShape.html

使用这种方法,您将拥有不那么复杂的 reducer ,如此处所述 https://redux.js.org/docs/recipes/reducers/UpdatingNormalizedData.html

对于这种形状的商店,您将不得不构建一个复杂的 reducer 。

关于javascript - 如何更新或删除 ngrx 实体中的嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48408291/

相关文章:

javascript - 在繁忙的 JavaScript 代码期间页面未更新

javascript - 如何使用 defaultProps 定义 React 函数组件的接口(interface)而不引发丢失类型错误?

javascript - JavaScript 中的最后一个 boolean 标志

JavaScript 将 4 个字节的数组转换为从 modbusTCP 读取的浮点值

javascript - 如何将 Electron ipcRenderer 集成到基于 TypeScript 的 Angular 2 应用程序中?

javascript - 使用 angular 从指令中的 API 调用更新组件数据

angular - on() 函数创建 Reducer 时出错

javascript - React 应用程序中未触发 Observable.timer

html - 检查 "Not in"列表条件 Angular 2 模板

javascript - 可观察到的 : flatMap randomly not triggered