我无法在 app.module 中为 ngrx 注册我的减速器

Posted

技术标签:

【中文标题】我无法在 app.module 中为 ngrx 注册我的减速器【英文标题】:I cannot Register my reducer in app.module for ngrx 【发布时间】:2022-01-11 04:13:23 【问题描述】:

我是 ngrx 的新手,我正在尝试学习几个示例。我正在使用 Angular 13 和 ngrx 13.0.1。

我的状态被声明为:

import  Swivlr  from '../Models/swivlr.model';

export interface AppState 
  readonly swivlr: Swivlr[];

我已经如下声明了我的减速器:

import  Action, State  from '@ngrx/store';
import  Swivlr  from '../../Models/swivlr.model';
import * as SwivlrActions from './../Actions/swivlr.actions';

export const initialState: AppState = 
 swivlr: [
  key: '1',
  name: 'Swivlr',
  url: 'http://Swivlr.com',
  width: '48',
  height: '48'
 ]


export function reducer(state = [initialState], action: SwivlrActions.Actions) 

switch (action.type) 
case SwivlrActions.ADD_SWIVLR:
  return [...state, action.payload];
case SwivlrActions.REMOVE_SWIVLR:
  state.splice(action.payload, 1)
  return state;

 default:
  return state;
 

我的 Action 声明为:

import  Injectable  from '@angular/core'
import  Action  from '@ngrx/store'
import  Swivlr  from '../../Models/swivlr.model'

export const ADD_SWIVLR    = '[SWIVLR] Add'
export const REMOVE_SWIVLR = '[SWIVLR] Remove'

export class AddSwivlr implements Action 
  readonly type = ADD_SWIVLR

  constructor(public payload: Swivlr)  


export class RemoveSwivlr implements Action 
  readonly type = REMOVE_SWIVLR

  constructor(public payload: number)  


export type Actions = AddSwivlr | RemoveSwivlr

在我的 app.module.ts 我有:

import  NgModule  from '@angular/core';
import  BrowserModule  from '@angular/platform-browser';

import  AppComponent  from './app.component';
import  StoreModule  from '@ngrx/store';
import  StoreDevtoolsModule  from '@ngrx/store-devtools';
import  reducer  from '../Services/Reducers/swivlr.reducer';

@NgModule(
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    StoreModule.forRoot( swivlr : reducer ),
    StoreDevtoolsModule.instrument(
      maxAge: 25 //  Retains last 25 states
    )
  ],
  providers: [],
  bootstrap: [AppComponent]
)
export class AppModule  

Angular 不喜欢我的 StoreModule.forRoot( swivlr: reducer ) 代码行

我收到的错误是:

错误:src/app/app.module.ts:15:27 - 错误 TS2322:类型 '(状态: 旋转[] | undefined, action: Actions) => Swivlr[]' 不可赋值 键入“ActionReducer”。参数类型 “行动”和“行动”是不相容的。 类型“动作”不可分配给类型“动作”。 “Action”类型中缺少属性“payload”,但在“RemoveSwivlr”类型中是必需的。

15 StoreModule.forRoot( swivlr : reducer ), ~~~~~~

src/Services/Actions/swivlr.actions.ts:17:15 17 构造函数(公共负载:数字) ~~~~~~~~~~~~~~~~~~~~~~ 'payload' 在这里声明。

【问题讨论】:

【参考方案1】:

在您的代码中,您可以使用 StoreModule.forRoot(reducer) 见下文 https://stackblitz.com/edit/angular-webcontainer-template-era8cj?file=src%2Fapp%2Freducer.ts

【讨论】:

非常感谢您消除了我的错误。这几天我一直在尝试解决这个问题。

以上是关于我无法在 app.module 中为 ngrx 注册我的减速器的主要内容,如果未能解决你的问题,请参考以下文章

如何为我的 Angular 应用程序注册 ngrx 子功能(StoreModule.forFeature())?

ngrx StoreModule.forRoot 命名约定

Ngrx - 减速器无法接收动作

角度ngrx存储错误无法读取未定义的属性“计划”

是否有一些示例可以在一个命令中在 Angular 7 上创建 ngrx/Store

无法使 @ngrx/store 正常工作