在我用 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/