Эффект выхода из NgRx не срабатывает - PullRequest
1 голос
/ 04 марта 2020

Я создал небольшое приложение, которое позволяет пользователю входить и выходить из системы, используя состояние ngrx. Логин пользователя работает хорошо. Я могу войти в систему и с помощью AuthGuard я могу проверить, остается ли пользователь в системе после входа в систему после ссылки sh страницы. Теперь я должен выйти из системы. Это моё действие:

export const LOGOUT = '[Auth] Logout';
export const logout = createAction(
    LOGOUT
  );

чем эффект

logout$ = createEffect(() =>
        this.actions$
            .pipe(
                ofType(userActions.logout),
                tap(action => {
                    localStorage.removeItem('user');
                    this.router.navigate(['login']);
                })
            )
    ,{dispatch: false});

и нашего редуктора:

export const authReducer = createReducer (
    defaultUser,

    on(userActions.logout, (state, action) => {
        return {
            user: undefined
        }
    })
)

После этого я могу создать в своем компоненте кнопка выхода с этим

onLogout(){
    this.store.dispatch(logout())
  }

Я ожидаю, что диспетчер вызовет действие, а затем эффект. Внутри эффекта он должен удалить пользователя из localStorage. но даже если я попытаюсь отладить эффект, он не входит в оператор крана. Он не удаляет элемент и не перенаправляет на страницу входа. Я что-то еще здесь пропустил?

1 Ответ

0 голосов
/ 05 марта 2020

Как уже упоминалось в официале, сделайте c,

После того, как вы написали свой класс эффектов, вы должны зарегистрировать его, чтобы эффекты начали работать. Чтобы зарегистрировать эффекты root уровня, добавьте метод EffectsModule.forRoot() с массивом ваших эффектов к вашему AppModule.

Если в этом случае модуль effect называется AuthEffect, у нас должен быть этот фрагмент кода в AppModule:

import { EffectsModule } from '@ngrx/effects';
import { AuthEffects } from './effects/auth.effects';

@NgModule({
  imports: [
    EffectsModule.forRoot([ AuthEffects ])
  ],
})
export class AppModule {}

Если аутентификация осуществляется внутри функционального модуля , вы должны использовать этот код для регистрации AuthEffect внутри AuthModule:

import { EffectsModule } from '@ngrx/effects';
import { AuthEffects } from './effects/auth.effects';

@NgModule({
  imports: [
    EffectsModule.forFeature([ AuthEffects ])
  ],
})
export class AuthModule {}
...