我有以下路线,它们都有相同的路径。路由是根据逻辑激活的,canLoad但 Angular 仅使用数据评估第一个路由,A如果第一个失败,则不会通过第二个。我测试了里面的逻辑,canLoad没有错。它返回真假。
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),
}
]
}
];
可以加载:
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:
你想用这个实现来完成什么
用户案例:我有多个模块并根据 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. aorb路径不是路径的一部分。
如果我们可以看到您的警卫实施,这也将有助于提供更多上下文
我也尝试过使用guard,但这也无济于事,因为所有路径都是相同的''空字符串,并且 Angular 路由与第一个匹配,并且不会评估其余路径的保护。
您希望将哪些数据与第一条路线相关联以及您打算如何使用它
数据的目的只是为了知道正在评估哪条路线。