#angular
Вопрос:
Я ищу решение, чтобы игнорировать одноразовую защиту, передавая параметр/флаг/и т. Д. В навигаторе маршрутизатора.
Текущая конфигурация:
- стандартная маршрутизация с аутентификацией
canActivate: [CanActivateGuard]
- распознаватель — проверка приложения подпространства — для загрузки моментального снимка, когда пользователь получил URL-адрес с некоторым путем, может загрузить приложение,
Проблема:
- вышеописанный механизм отлично работает (снимок, создание потерянных данных хранилища ngrx и т.д.)
- но в guard я проверяю, существует ли какая-то ценность в магазине:
canActivate(): boolean {
let canActivate = false;
this.store$.pipe(select(selectSth), take(1)).subscribe(item => {
if (!!item) {
return canActivate = true;
}
this.router.navigate(['/main']);
return canActivate = false;
});
return canActivate;
}
}
- canActivate был проверен перед распознавателем — поэтому я не могу перейти к
/main
пути, даже если параметр существует в хранилище
Вопрос:
Есть ли какое-либо решение, чтобы добавить параметр this.router.navigate
и один раз избежать защиты?
Комментарии:
1. У меня та же проблема. Пытался охранять детей. Но безуспешно.
2. Использовать
async canActivate
иawait this.store$.pipe().toPromise();
3. Где я могу его использовать?
Ответ №1:
Дело в том, что в Angular все охранники должны быть выполнены перед любым решателем, поэтому, если у вас есть дочерние маршруты с охранниками, они заблокируют родительские решатели, если все охранники не добьются успеха.
Эта логика означает, что данные для охранника должны уже существовать (инициализация приложения) или загружаться охранником.
Возможным решением является перенос логики загрузки данных в guard, и если guard добьется успеха, то соответствующий определитель просто выберет данные из хранилища.
Если вы не планируете все время использовать guards и распознаватели вместе, вы можете ввести службу, которая загружает данные, если это необходимо, и полагаться на службу в обоих классах: guard и распознаватель.