You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:40:21