ngRx 状态更改丢失

Posted

技术标签:

【中文标题】ngRx 状态更改丢失【英文标题】:ngRx state change getting lost 【发布时间】:2018-10-16 04:02:14 【问题描述】:

按照一些示例,我正在尝试管理侧边栏组件的状态(打开/关闭)。我已经定义了一些接口来管理我的状态对象:

export interface AppState 
  readonly layoutState: LayoutState;


export interface LayoutState 
  sideBarOpen: boolean;

我的组件中有一个实现 LayoutState 接口的局部变量:layout: LayoutState;

我在ngOnInit订阅我的状态:

this.store.subscribe(appState => 
  this.layout = appState.layoutState;
  // (5)
);

我的 UI 中有一个按钮调用包含以下行的函数:this.toggleSideNav(this.layout.sideBarOpen);

toggleSideNav 看起来像这样:

toggleSideNav(currentState: boolean) 
    this.store.dispatch(new LayoutActions.ToggleSidebarAction(currentState)); // (1)
  

这是我的效果:

@Effect()
  toggleSidebar$ = this.actions$
    .ofType(LayoutActions.TOGGLE_SIDEBAR)
    .switchMap((action: ToggleSidebarAction) =>
      this.layoutService.toggleSidebar(action.payload) // (2)
    )
    .map((layoutState: LayoutState) => 
       // (4)
      return new LayoutActions.ToggleSidebarSuccessAction(layoutState);
    );

这是layoutService.toggleSidebar 函数:

toggleSidebar(currentState: boolean): Observable<LayoutState> 
    const rv = 
      sideBarOpen: !currentState
    ;
    // (3) 
    return Observable.of(rv);
  

这是我在调试时看到的。在位置:

(1) - currentStatefalse - 正如预期的那样

(2) - action.payloadfalse - 正如预期的那样

(3) - rvsideBarOpen: true - 正如预期的那样

(4) - layoutStatesideBarOpen: true - 正如预期的那样

(5) - this.layoutsideBarOpen: false - !!

为什么状态会在 (4) 和 (5) 之间“丢失”?

【问题讨论】:

【参考方案1】:

我忘记了在 Effect 之后,它进入了 Reducer。我的 Reducer 只有这个:

switch (action.type) 
    case Actions.LOAD_LAYOUT_SUCCESS:
      return action.payload;
    default:
      return state;
  

我必须为 TOGGLE_SIDEBAR_SUCCESS 消息添加一个案例以发送新状态(包含在有效负载中):

switch (action.type) 
    case Actions.LOAD_LAYOUT_SUCCESS:
      return action.payload;
    case Actions.TOGGLE_SIDEBAR_SUCCESS:   <--
      return action.payload;               <--
    default:
      return state;
  

在添加之前,reducer 一直处于默认情况,并返回 state,这是 状态。

【讨论】:

以上是关于ngRx 状态更改丢失的主要内容,如果未能解决你的问题,请参考以下文章

NGRX - 如何在 Angular 防护中访问我的应用程序状态?

Ngrx - 选择器在存储更改后没有发出新值

ngrx 4 选择器返回整个状态而不是子状态

在 Angular 中使用 ngrx 进行状态管理时,控制台记录状态数据

如何重置ngrx/store的所有状态?

如何删除ngrx中以前的存储状态?