如何在NgRx Data中修改additionalCollectionState内的selectedForReports?
解决NgRx Data修改additionalCollectionState的问题
要修改Store中selectedForReports这个额外集合状态,需要通过自定义Action+扩展实体Reducer的方式实现,因为NgRx Data本身没有提供默认的操作来修改自定义的额外状态,具体步骤如下:
1. 创建自定义Action
定义一个用于更新selectedForReports的Action,明确传递的数据结构:
import { createAction, props } from '@ngrx/store'; // 替换成你的ForReport实体类型 import { ForReport } from '../models/for-report.model'; export const updateSelectedForReports = createAction( '[ForReports] 更新选中项', props<{ selected: ForReport[] }>() );
2. 扩展实体Reducer
创建包含额外状态的实体State类型,并扩展NgRx Data的默认实体Reducer,添加自定义Action的处理逻辑:
import { EntityState, createEntityAdapter } from '@ngrx/entity'; import { createReducer, on } from '@ngrx/store'; import { ForReport } from '../models/for-report.model'; import { updateSelectedForReports } from './for-reports.actions'; import { entityReducer } from '@ngrx/data'; // 定义包含额外状态的实体State export interface ForReportsState extends EntityState<ForReport> { selectedForReports: ForReport[]; } // 创建实体适配器并设置初始状态 const adapter = createEntityAdapter<ForReport>(); const initialState: ForReportsState = adapter.getInitialState({ selectedForReports: [], }); // 扩展默认实体Reducer,添加自定义Action处理 export const forReportsReducer = createReducer( initialState, // 继承NgRx Data默认的实体操作处理 ...entityReducer(initialState, 'forReports').cases, // 处理自定义更新选中项的Action on(updateSelectedForReports, (state, { selected }) => ({ ...state, selectedForReports: selected, })) );
3. 在模块中注册自定义Reducer
在你的ForReportsModule中,通过StoreModule.forFeature注册这个自定义Reducer,关联到实体的key"forReports":
import { NgModule } from '@angular/core'; import { StoreModule } from '@ngrx/store'; import { EntityDefinitionService, EntityDataService } from '@ngrx/data'; import { forReportsReducer } from './for-reports.reducer'; import { ForReportsDataService } from './for-reports-data.service'; import { entityMetadata } from './entity-metadata'; @NgModule({ imports: [ StoreModule.forFeature('forReports', forReportsReducer), // 其他必要模块,比如EntityDataModule等 ], providers: [ForReportsDataService] }) export class ForReportsModule { constructor( private eds: EntityDefinitionService, private entityDataService: EntityDataService, private forReportsDataService: ForReportsDataService ) { eds.registerMetadataMap(entityMetadata); entityDataService.registerService("forReports", forReportsDataService); } }
4. 在组件/服务中触发更新
在需要更新selectedForReports的地方,通过Store dispatch自定义Action即可:
import { Component } from '@angular/core'; import { Store } from '@ngrx/store'; import { updateSelectedForReports } from './for-reports.actions'; import { ForReportsState } from './for-reports.reducer'; import { ForReport } from '../models/for-report.model'; @Component({ // 组件元数据 }) export class YourComponent { constructor(private store: Store<{ forReports: ForReportsState }>) {} updateSelect(value: ForReport[]) { this.store.dispatch(updateSelectedForReports({ selected: value })); } }
关键说明
additionalCollectionState仅用于定义额外状态的初始值,修改必须通过NgRx标准的Action+Reducer流程,不能直接赋值- 扩展Reducer时要继承NgRx Data的
entityReducer,确保默认的实体操作(增删改查)不受影响
内容的提问来源于stack exchange,提问作者Parth Developer
相关产品推荐
相关产品推荐

