#spartacus-storefront
#spartacus-storefront
Вопрос:
Когда ни один пользователь не зарегистрирован, мои узлы навигации отличаются от тех, когда пользователь вошел в систему. Когда я выполняю вход в систему, мои узлы навигации обновляются только после обновления страницы (F5). Есть ли способ принудительно перестроить / обновить узлы навигации?
Ответ №1:
Это связано с тем, что хранилище NgRx кэширует «узлы навигации», загруженные перед входом в систему. Здесь F5 загружает все приложение, включая все состояние NgRx.
Что вам нужно сделать, так это создать глобальный метаредуктор, который очищает кэш узла навигации «cms.navigation» при выполнении действия login или logout. вы можете сделать это с помощью глобального мета-редуктора https://ngrx.io/guide/store/metareducers
вы можете добавить класс с чем-то вроде этого, чтобы решить эту проблему:
function clearNavigationState(action: Action, state) {
if (
action.type === AuthActions.LOGIN ||
action.type === AuthActions.LOGOUT
) {
return { ...state, //logic to clear the navigation state };
} else {
return state;
}
}
export function metaReducerFactory(): MetaReducer<any> {
return (reducer: ActionReducer<any>) => (state, action) => {
const newState = clearNavigationState(action, state);
return reducer(newState, action);
};
}
@NgModule({
providers: [
{
provide: META_REDUCERS,
deps: [],
useFactory: metaReducerFactory,
multi: true,
},
],
})
Комментарии:
1. спасибо за ваш ответ, но хранятся ли узлы навигации вообще в магазине? Если да, то где?
2. да, они определенно есть в магазине в разделе «cms.navigation», проверьте github.com/SAP/spartacus/blob/develop/projects/core/src/cms /… строка:77 здесь вы найдете определение состояния
Ответ №2:
Временное решение:
ngOnInit(): void {
this.router.events.subscribe((event: Event) => {
if (
event instanceof NavigationStart amp;amp;
this.winRef.nativeWindow.location.href.includes('login')
) {
this.node$ = this.service.getNavigationNode(this.componentData.data$);
}
});
}