Одно из требований к приложению, над которым я работаю, - поддержка нескольких префиксов маршрутов.
то есть /shop
и /store
должны совпадать. Я добился этого с помощью настраиваемого UrlMatcher:
matchPathsStartingWith(startingWith: string[]) {
return (url: UrlSegment[]): UrlMatchResult => {
if (url.length) {
let s = url.map(u => u.path).join('/');
console.info(s);
if (startingWith.includes(url[0].path)) {
return { consumed: url };
}
}
return null;
};
}
Я использую это следующим образом:
{
matcher: new UrlPathMatcher().matchPathsStartingWith([
'store',
'shop',
]),
loadChildren:
'app/store.module#StoreModule',
},
Затем в моем модуле Store у меня определены следующие маршруты:
const routes: Routes = [
{
path: '',
component: StoreDashboardComponent,
},
{
path: 'products',
component: ProductsListComponent,
},
];
Проблема, с которой я столкнулся, заключается в том, что это соответствует только первому маршруту (то есть StoreDashboardComponent
, но не ProductsListComponent
. Я предполагаю, что это связано с тем, что возвращается моей настраиваемой функцией сопоставления.
Что мне нужно вернуть, чтобы достичь желаемой функциональности?
Обновлено: если я полностью избавлюсь от URLMatcher и вместо этого создаю два отдельных маршрута для «магазин» и «магазин», он будет работать нормально.
@AndrewLobban Это неверно. У вас может быть корневой путь (''
) перед именованным путем ('foo'
), и оба все еще могут быть маршрутизированы в нормальном состоянии. То, что вы имеете в виду, происходит, когда у вас есть путь наподобие ':id'
перед именованным путем. В этом случае путь к параметру всегда будет направлен, а именованный путь никогда не будет задействован.
Ага, попробовал поменять местами, ничего не решает.
Поменяйте положение маршрутов.
path: ''
с первым совпадением, и никакие другие не будут маршрутизированы. Это самая вопиющая проблема, которую я вижу. МаршрутыDefault
иWildcard
должны быть самыми последними в последовательности.