简体   繁体   English

Angular ngrx - 使用 object 内的数组更新存储

[英]Angular ngrx - Update store with an array inside object

I have an effects like this:我有这样的效果:

loadFolder$ = createEffect(() => {
return this.action$.pipe(
  ofType(SidebarAction.loadFirmSuccess),
  switchMap(action => {
    const foldersList = {};

    if(!action.selectedFirm) {
      action.firms[0].roles.map((role: string) => {
        foldersList[role.toLowerCase()] = this.sidebarService.getFolders(action.userId, action.firms[0].id.toString() , role, action.page.toString(), action.size.toString());
      });
    }

    else {
      action.selectedFirm.roles.map((role: string) => {
        // tslint:disable-next-line: no-non-null-assertion
        foldersList[role.toLowerCase()] = this.sidebarService.getFolders(action.userId, action.selectedFirm!.id.toString() , role, action.page.toString(), action.size.toString());
      });
    }

    return forkJoin(foldersList).pipe(map(res => {
      return SidebarAction.loadFolderSuccess({folders : res, selectedFirm: action.selectedFirm});
    }));
  })
);
});

it returns me folders object that is like this它返回给我的文件夹 object 是这样的

 folders: {
    admin: [[{idFolder: 1, folderName: 'folder1'}], {page: 1, size: 2}, {amount: 3}],
    superadmin: [[{idFolder: 1, folderName: 'folder1'}], {page: 1, size: 2}, {amount: 3}],
    user: [[{idFolder: 1, folderName: 'folder1'}], {page: 1, size: 2}, {amount: 3}]
 }

all the keys are not ever present...it depends.所有的钥匙都不存在......这取决于。

This is the issue, I have a first result like this:这就是问题所在,我的第一个结果是这样的:

 folders: {
    admin: [[{idFolder: 1, folderName: 'folder1'}, {idFolder: 2, folderName: 'folder2'}], {page: 1, size: 2}, {amount: 4}]
 }
 

When I increment page I dispatch the same action for having other results当我增加页面时,我会发送相同的操作以获得其他结果

  folders: {
    admin: [[{idFolder: 3, folderName: 'folder3'}, {idFolder: 4, folderName: 'folder4'}]{page: 2, size: 2}{amount: 4}]
 }

This is the reducer:这是减速器:

  export const sideBarReducer = createReducer(
   initialSidebarState,
   on(SidebarActions.loadFolderSuccess, (state, action): SidebarState => {
      return {
               ...state,
               folders: action.folders,
               selectedFirm : action.selectedFirm
      };
    }),
  );

action.folders is potentially an object like this action.folders 可能是这样的 object

 folders: {
    admin: [[{idFolder: 1, folderName: 'folder1'}],{page: 1, size: 2},{amount: 3}],
    superadmin: [[{idFolder: 1, folderName: 'folder1'}],{page: 1, size: 2},{amount: 3}],
    user: [[{idFolder: 1, folderName: 'folder1'}],{page: 1, size: 2},{amount: 3}]
 }

I want to update the status for obtaining the previous state with new ones, like this:我想用新的更新状态以获取以前的 state,如下所示:

  folders: {
    admin: [[{idFolder: 1, folderName: 'folder1'}, {idFolder: 2, folderName: 'folder2'}, {idFolder: 3, folderName: 'folder3'}, {idFolder: 4, folderName: 'folder4'}],{page: 2, size: 2},{amount: 3}],
    superadmin: [[{idFolder: 1, folderName: 'folder1'}],{page: 1, size: 2},{amount: 3}],
    user: [[{idFolder: 1, folderName: 'folder1'}],{page: 1, size: 2},{amount: 3}]
 }

but with reducer I see this state:但是使用减速器我看到了这个 state:

     folders: {
       admin: [[{idFolder: 3, folderName: 'folder3'}, {idFolder: 4, folderName: 'folder4'}],{page: 2, size: 2},{amount: 3}],
  
     }

I tried to use spread operator in reducer but it doesn't work.我尝试在 reducer 中使用展开运算符,但它不起作用。 It's obvious because change is inside the array that's into the folder object.这很明显,因为更改位于文件夹 object 中的数组中。

  export const sideBarReducer = createReducer(
   initialSidebarState,
   on(SidebarActions.loadFolderSuccess, (state, action): SidebarState => {
      return {
               ...state,
               folders: {...state.folders, action.folders},
               selectedFirm : action.selectedFirm
      };
    }),
  );

Object spread only do a shallow merge. Object spread 只做浅层合并。 You need to do deep merging, for example you can use merge您需要进行深度合并,例如您可以使用merge

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM