У меня есть следующие маршруты, которые имеют одинаковый путь. Маршрут активируется на основе логики c в canLoad
, но Angular оценивает первый маршрут только с данными A
и не переходит go через секунду, если первый отказывает. Я проверил логи c в canLoad
, и в этом нет ничего плохого. Возвращает true и false.
const routes: Routes = [
{
path: '',
component: NbAuthComponent,
children: [
{
path: '',
canLoad: [AuthGuardProviderService],
data: {provider: 'A'},
loadChildren: () => import('./xx/auth.module').then(m => m.AuthModule),
},
{
path: '',
canLoad: [AuthGuardProviderService],
loadChildren: () => import('./x/auth.module').then(m => m.AuthModule),
}
]
}
];
CanLoad:
export class AuthGuardProviderService implements CanLoad {
constructor() {
}
canLoad(route: Route): boolean {
const data = route.data.provider;
return this.getRoute(data);
}
private getRoute(data): boolean {
const paths = location.href.split('/');
if (data === 'A') {
return true;
} else if (!data) {
return true;
}
}
}
Обновлен вопрос с использованием UrlMatcher
:
что вы Вы пытаетесь выполнить sh с помощью этой реализации
Случай пользователя: у меня есть несколько модулей, и я загружаю модуль на основе URL. Например: пользователь A нажимает: localhost/a
и модуль загружается.
path: '',
loadChildren: () => import('./a/auth.module').then(m => m.AuthModule)
А если пользователь B нажимает: localhost/b
Я хочу загрузить:
path: '',
loadChildren: () => import('./b/auth.module').then(m => m.AuthModule)
Я могу использовать UrlMatcher
, но это работает только для первого маршрута.
const matcher = (url: UrlSegment[], providerParam) => {
const paths = location.href.split('/');
if ((paths[3] === '' || paths[3] === 'auth') && providerParam === 'win') {
return {consumed: url};
} else if (paths[3] !== '') {
const provider = providers.find(p => paths[3].toLowerCase() === p.shortName);
return provider && provider.shortName === providerParam ? {consumed: url} : null;
}
return null;
};
И модуль отложенной загрузки имеет:
const routes: Routes = [
{
path: '',
component: NbAuthComponent,
children: [
{
path: '',
component: NbLoginComponent,
},
{
path: 'sign-in',
component: NbLoginComponent,
},
{
path: 'sign-up',
component: NbRegisterComponent,
}
],
},
];
Теперь проблема с этим подходом состоит в том, что он всегда загружает sign-in
составная часть. Он всегда набирает path: ''
, не переходя на другие пути, такие как auth/sign-up
Возможно, стоит упомянуть, что если пользователь нажимает localhost/a
, я устанавливаю a
как baseHref
, поэтому я не могу использовать это как путь. Было бы просто, если бы я не установил его как baseHref
. Путь a
или b
не является частью маршрута.
Это также помогло бы предоставить больше контекста, если бы мы могли видеть вашу реализацию защиты
Я также попытался использовать guard
, но это тоже не полезно, поскольку все пути одинаковы ''
пустая строка, а Angular маршруты совпадают с первым и не оценивают защиту для остальных.
что данные, которые вы хотите связать с первым маршрутом и как вы планируете его использовать
Цель данных - просто узнать, какой маршрут оценивается.