Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在角度NgRx中合并对象与状态时出现问题_Angular_Typescript_Ecmascript 6_Ngrx - Fatal编程技术网

Angular 在角度NgRx中合并对象与状态时出现问题

Angular 在角度NgRx中合并对象与状态时出现问题,angular,typescript,ecmascript-6,ngrx,Angular,Typescript,Ecmascript 6,Ngrx,我阅读了本教程,因此创建了一个具有以下形状的简单商店 export const initialState: IState = { app: initialAppState }; export function getInitialState(): IState { return initialState; } export interface IApp { id?: string; testMode?: boolean; authenticated?: boolean;

我阅读了本教程,因此创建了一个具有以下形状的简单商店

export const initialState: IState = {
  app: initialAppState
};

export function getInitialState(): IState {
  return initialState;
}

export interface IApp {
  id?: string;
  testMode?: boolean;
  authenticated?: boolean;
  user?: User;
  role?: string;
}

export interface IAppState {
  app: IApp;
}

export const initialAppState: IAppState = {
  app: {
    id: null,
    testMode: false,
    authenticated: false,
    user: null,
    role: 'END_USER'
  }
};
它有一个动作
PatchApp
,减速器如下所示

export const appReducers = (state = initialAppState, action: AppActions): IAppState => {
  switch (action.type) {
    case AppActionTypes.PatchApp: {
      return { ...state, app: action.payload };
    }

    default:
      return state;
  }
};
现在对我来说,这似乎非常简单。我们有一个初始状态存储在
app
属性中。如果我们得到一个有效负载来更新现有状态的
authenticated
属性,我希望reducer只覆盖该属性而不是整个状态

但是,当我逐步使用调试器时,我可以看到状态get只使用传入的属性进行了更新

如果我有这样的初始状态:

export const initialAppState: IAppState = {
  app: {
    id: null,
    testMode: false,
    authenticated: false,
    user: null,
    role: 'END_USER'
  }
};
然后我使用
{authenticated:true,id:'someid'}
执行
PatchApp
,我希望
操作.payload
覆盖/合并/修补现有对象

相反,只使用属性覆盖整个存储get。因此,在完成了正式的补丁应用程序之后,我们只需要设置
认证
id
道具

你知道我的减速机为什么不能正常工作吗?我读了一篇文章,没有发现任何地方出了问题

我还尝试使用
Object.assign()
合并对象

return Object.assign({}, state, { app: action.payload });
我有一个代码沙盒,它说明了我试图解决的问题


不确定我是否正确理解了您的意图,但您似乎只想修补状态的
应用程序部分。如果是这样,您应该这样做:

export const initialAppState: IAppState = {
  app: {
    id: null,
    testMode: false,
    authenticated: false,
    user: null,
    role: 'END_USER'
  }
};
export const appruces=(state=initialAppState,action:AppActions):IAppState=>{
开关(动作类型){
案例AppActionTypes.PatchApp:{
返回{
……国家,
应用:{…state.app,…action.payload}
};
}
违约:
返回状态;
}
};

不确定我是否正确理解了您的意图,但似乎您只想修补
应用程序的状态部分。如果是这样,您应该这样做:

export const initialAppState: IAppState = {
  app: {
    id: null,
    testMode: false,
    authenticated: false,
    user: null,
    role: 'END_USER'
  }
};
export const appruces=(state=initialAppState,action:AppActions):IAppState=>{
开关(动作类型){
案例AppActionTypes.PatchApp:{
返回{
……国家,
应用:{…state.app,…action.payload}
};
}
违约:
返回状态;
}
};