Angular 9 одинаковых путей маршрута разные компоненты

Я пытаюсь определить правильный путь набора URL-адресов, которые имеют одинаковую структуру. У меня есть путь /:id/:areaId и /:id/:cityId, и это сделано по соображениям SEO. Когда я приду к его реализации, мне нужно знать, существует ли :areaId (выполнив вызов API), и если это не так, я попытаюсь проверить, существует ли :cityId, чтобы перейти к нему.

Первое, о чем я подумал, это canActivate в моем маршруте, потому что мне нужно внедрить сервис, и это казалось мне естественным. Я внедрил защиту и применил ее к компоненту area, и моя проблема заключается в том, что canActivate становится false, потому что навигация останавливается. Я читал об использовании urlMatchers, однако я не думаю, что у меня есть вся информация, необходимая в сегментах и ​​сервисах для внедрения с использованием чего-то вроде 2 разных компонента Angular с одним и тем же маршрутом мне кажутся неправильными, а также происходит сбой, если я пытаюсь перейти непосредственно к URL-адресу, а не через дом - инжектор не определяется, когда я перемещаюсь напрямую.

Мой вопрос: используя охранники или что-то подобное, могу ли я перейти к следующему совпадающему URL-адресу, когда результат моей защиты ложен?

Для справки, моя защита выглядит так:

@Injectable()
export class AreaGuard implements CanActivate {
    constructor(private areasService: AreasService) { }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        const areaId= route.params['areaId'];
        return this.areasService.isArea(areaId)
                                .then(a => {
                                    return true;
                                })
                                .catch(e => {
                                    console.log('Checking area', e);
                                    return false;
                                });
    }
}

person Carlos Torrecillas    schedule 21.08.2020    source источник


Ответы (1)


На вашем месте я бы создал Component для обработки этой спецификации. Выполнение HTTP-вызовов внутри Guards я бы не рекомендовал.

У вас может быть только один маршрут и загрузка нового созданного компонента. Выполните свои HTTP-вызовы, а затем с помощью простого *ngIf вы сможете решить, какой компонент загрузить.

person StPaulis    schedule 21.08.2020