angular - @ngx/store/update-reducers 意外地修改了我的应用程序的状态

标签 angular firebase redux firebase-authentication ngrx

在我用 Angular 开发的应用程序中,我使用 Firebase Authentication 的服务进行身份验证,在我的应用程序登录的那一刻,状态发生了正确的变化方式,根据需要保留表单的所有状态。

当我登录时,我在 Redux DevTools 中注意到我的应用程序的状态具有 “auth” 身份验证状态,因此我可以从经过身份验证的用户访问数据。

当我导航到系统上的任何其他页面时,"auth" 身份验证状态在发生名为 "@ngrx/store/update-reducers" 的事件后消失并且我的系统上不再有身份验证状态信息。

为什么会发生这种情况?为什么调用 "@ngrx/store/update-reducers"

我有一个文件位于 "src/app" 树内的 "store" 文件夹中。 在这个文件中,我在根模块 “app.module” 中创建了所有 reducer。

index.ts:

import { ActionReducerMap, createFeatureSelector } from '@ngrx/store';
import { ActivatedRouteSnapshot, RouterStateSnapshot, Params } from '@angular/router';

import * as fromRouter from '@ngrx/router-store';
import * as fromAuth from '../reducers/auth.reducer';
import * as fromMessenger from '../reducers/messenger.reducer';

export interface RouterStateUrl {
    url: string;
    queryParams: Params;
    params: Params;
}

export interface StateApp {
    auth: fromAuth.AuthState;
    router: fromRouter.RouterReducerState<RouterStateUrl>;
    messenger: fromMessenger.MessengerState;
}

export const reducers: ActionReducerMap<StateApp> = {
    auth: fromAuth.reducer,
    router: fromRouter.routerReducer,
    messenger: fromMessenger.reducer
};

export const getMessengerState = createFeatureSelector<fromMessenger.MessengerState>('messenger');
export const getAuthState = createFeatureSelector<fromAuth.AuthState>('auth');

export const getRouterState = createFeatureSelector
    <fromRouter.RouterReducerState<RouterStateUrl>>
    ('router');

export class CustomSerializer
    implements fromRouter.RouterStateSerializer<RouterStateUrl> {
    serialize(routerState: RouterStateSnapshot): RouterStateUrl {

        const { url } = routerState;
        const { queryParams } = routerState.root;

        let state: ActivatedRouteSnapshot = routerState.root;

        while (state.firstChild) {
            state = state.firstChild;
        }

        const { params } = state;

        return { url, queryParams, params };
    }
}

app.module.ts

import { reducers, CustomSerializer } from './store/reducers';
import { effects } from './store/effects';

 StoreModule.forRoot(reducers, { metaReducers }),
    EffectsModule.forRoot(effects),

"messenger" 状态和其他状态保持不变,当我从一个页面导航到另一个页面时,唯一没有保持的状态是 "auth" 状态.

最佳答案

@ngrx/store/update-reducers 被调度到模块注册的地方。 这很难在没有看到完整代码的情况下“解决”,确保你不直接更新你的存储状态(ngrx-store-freeze metareducer 可以提供帮助)并且每个 reducer 都返回状态(确保有一个默认值case 在你的 reducer 的 switch 语句中只返回状态..

关于angular - @ngx/store/update-reducers 意外地修改了我的应用程序的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52104589/

相关文章:

typescript - 如何使用 typescript、next-redux-wrapper、getServerSideProps?

angular - Angular 中的单元测试 : Mocking RxJS observable with Jasmine

javascript - Node.js、TypeScript、JavaScript 和 Angular 之间的连接

javascript - Angular2 QueryList 基于元素类

angular - 在生产模式Electron + Angular中找不到sqlite文件

java - Firebase 远程配置 - android

reactjs - 如何在 react 中实现 AG 网格行内的按钮

ios - 应用程序在后台 iOS 时的 Firebase 数据库事务

javascript - Firebase 未定义?

javascript - React 组件未根据 redux 状态存储中的映射(数据结构)更改进行更新