Я также столкнулся с той же проблемой. К сожалению, в настоящее время (все еще) не существует готового решения для этого.
В итоге я немного поработал: получил вторичные (вспомогательные) маршруты из URL-адреса и добавил их в функцию навигации.
У меня был только один вторичный маршрут с именем popup, поэтому я создал регулярное выражение, чтобы получить путь к выходу всплывающего маршрутизатора: const POPUP_ROUTE_FROM_URL_REGEX = /\(popup:([^)]+)\)/
.
Затем я получил путь из URL: const popupRouteResult= POPUP_ROUTE_FROM_URL_REGEX.exec(this.router.url)
. (this.router вставляется в конструктор: private router: Router
.) Функция exec возвращает массив, где первый элемент является полным совпадением регулярного выражения (так (в данном случае (popup:‹path...›)), а после этого подстрока соответствует (так что в данном случае это только один: ‹path...›), поэтому путь всплывающего маршрута находится в popupRouteResult[1].
В функции навигации вы можете использовать ее следующим образом:
this.router.navigate(
[
<some path>,
{
outlets: {
// the line below ensures that the (possibly present) popup route is preserved when navigating
...(!!popupRouteResult&& { popup: popupRouteResult[1] }),
},
},
]
);
Если у вас есть несколько вторичных маршрутов, вы можете адаптировать регулярное выражение, чтобы получить все, что находится между скобками:
const SECONDARY_ROUTES_FROM_URL_REGEX = /\(([^)]+)\)/;
const secondaryRoutesResult = SECONDARY_ROUTES_FROM_URL_REGEX .exec(this.router.url);
Например, в вопросе secondaryRoutesResult[1]
вы получите "p1: .... // p2: .... // p3: ..."
.
Вы можете разделить эту строку на //, чтобы получить каждый отдельный выходной путь: const outlets = secondaryRoutesResult[1].split('//
), which will result in:
[p1: ...., p2: ...., p3]`. Вероятно, разумно сначала проверить, существует ли secondRoutesResult[1].
Затем вы можете перебрать розетки:
const outletsData = {outlets: {}};
outlets.forEach(outlet => {
// split by : to get the name of the outlet and the path separated
const splitOutlet = outlet.split(":");
const name = splitOutlet[0];
const path = splitOutlet[1];
outletsData[name] = path
});
И вы можете использовать эти данные в своей функции навигации:
this.router.navigate([<some path>, outletsData]);
Надеюсь, этот ответ поможет тому, кто столкнется с той же проблемой! Я надеюсь увидеть обновление в angular, так что этот хак больше не нужен, и есть просто свойство, которое вы можете использовать.
person
Emmy
schedule
19.02.2021