@ ngx / store / update-redurs изменяет состояние моего приложения нежелательно - PullRequest
0 голосов
/ 30 августа 2018

В моем приложении, разработанном в Angular , я использую услуги Аутентификация Firebase для аутентификации, в момент входа в систему моего приложения состояния меняются правильным образом, сохраняя все состояние формы, сколько мне нужно.

При входе в систему я заметил в Redux DevTools , что состояние моего приложения имеет статус аутентификации "auth", поэтому я могу получить доступ к данным аутентифицированного пользователя.

Когда я перехожу на любую другую страницу в моей системе, состояние аутентификации "auth" исчезает после события, которое называется "@ngrx/store/update-reducers", и там я больше не могу иметь информацию о состоянии аутентификации в моей системе.

Почему это может происходить? Почему вызывается "@ngrx/store/update-reducers"? 1017 *

У меня есть файл, который находится в папке "store" внутри дерева "src/app". В этом файле у меня есть все редукторы, которые я создаю в корневом модуле "app.module".

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".

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

У меня была такая же проблема, и мне удалось ее решить.

Основной причиной было то, что StoreModule.forRoot (...) вызывался снова, когда я загружал другой модуль. У меня был мой StoreModule.forRoot в модуле, где я храню свой основной код, CoreModule. CoreModule должен был быть импортирован только один раз, но я создал новый Модуль, и когда я перешел к этому модулю, он импортировал CoreModule и снова вызвал StoreModule.forRoot (...), что очистило хранилище.

0 голосов
/ 30 августа 2018

@ngrx/store/update-reducers отправляется там, где зарегистрированы модули. Это трудно «решить», не увидев полный код, убедитесь, что вы не обновляете состояние своего хранилища напрямую (метаредуктор ngrx-store-freeze может помочь) и что каждый редуктор возвращает состояние (убедитесь, что по умолчанию регистр в операторе switch вашего редуктора, который просто возвращает состояние ..

...