Как перейти к маршруту для братьев и сестер?

Предположим, я получил эту конфигурацию роутера

export const EmployeeRoutes = [
   { path: 'sales', component: SalesComponent },
   { path: 'contacts', component: ContactsComponent }
];

и перешли на SalesComponent по этому URL

/department/7/employees/45/sales

Теперь я хотел бы перейти к contacts, но поскольку у меня нет всех параметров для абсолютного маршрута (например, ID отдела, 7 в приведенном выше примере), я бы предпочел попасть туда по относительной ссылке, например

[routerLink]="['../contacts']"

or

this.router.navigate('../contacts')

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


person Thorsten Westheider    schedule 28.07.2016    source источник


Ответы (2)


Если вы используете новый маршрутизатор (3.0.0-beta2), вы можете использовать ActivatedRoute для перехода к относительному пути следующим образом:

constructor(private router: Router, private r:ActivatedRoute) {} 

///
// DOES NOT WORK SEE UPDATE
goToContact() {
  this.router.navigate(["../contacts"], { relativeTo: this.r });
}

Обновление от 02.08.2019 Angular 7.1.0

current route: /department/7/employees/45/sales

the old version will do: /department/7/employees/45/sales/contacts

Согласно комментарию @ KCarnaille, приведенное выше не работает с последней версией маршрутизатора. Новый способ - добавить .parent к this.r, чтобы

    // Working(08/02/2019) 
    goToContact() {
       this.router.navigate(["../contacts"], { relativeTo: this.r.parent });
    }

the update will do: /department/7/employees/45/contacts

person Harry Ninh    schedule 28.07.2016
comment
На самом деле я в такой же ситуации, но у меня это не работает ... что-то изменилось с момента официального релиза? - person KCarnaille; 01.03.2017
comment
@KCarnaille Хм, я использую @ angular / router 3.0.0 (готово, а не бета), и он все еще работает должным образом. Не уверен, есть ли у них какие-либо критические изменения с тех пор. - person Harry Ninh; 02.03.2017
comment
@ Гарри Нинь: На самом деле это моя вина. Простая проблема со структурой пути :) Работает - person KCarnaille; 02.03.2017
comment
Как мы можем сделать это из HTML с помощью routerLink? - person maxime1992; 11.05.2017
comment
Здорово! Я был сбит с толку около часа. - person Paul Johnson; 28.03.2019
comment
На самом деле это не должно решаться .parent, просто удалите ../ и оставьте в пути только контакты, например: this.router.navigate(["contacts"], { relativeTo: this.r}); - person ziz194; 11.07.2019
comment
Это хорошая информация. Shame angular не включает такую ​​ПОЛЕЗНУЮ информацию в свою документацию, как будто все, что нужно, - это приложение Heroes. Насколько сложна маршрутизация? У вас есть дерево, абсолютный и относительный пути, arrgh. - person godhar; 01.08.2019
comment
Я действительно не понимаю этой логики. В ОТНОШЕНИИ родительского маршрута мы возвращаемся на один уровень назад (дедушка и бабушка) и переходим к контактам. Это должно дать нам / отдел / 7 / сотрудники / контакты - person Craig; 02.10.2019

Директива RouterLink всегда рассматривает предоставленную ссылку как дельту к текущему URL-адресу:

[routerLink]="['/absolute']"
[routerLink]="['../../parent']"
[routerLink]="['../sibling']"
[routerLink]="['./child']"     // or
[routerLink]="['child']" 

// with route param     ../sibling;abc=xyz
[routerLink]="['../sibling', {abc: 'xyz'}]"
// with query param and fragment   ../sibling?p1=value1&p2=v2#frag
[routerLink]="['../sibling']" [queryParams]="{p1: 'value', p2: 'v2'}" fragment="frag"

Метод navigate() требует начальной точки (т. Е. Параметра relativeTo). Если ничего не указано, навигация будет абсолютной:

constructor(private router: Router, private route: ActivatedRoute) {}

this.router.navigate(["/absolute/path"]);
this.router.navigate(["../../parent"], {relativeTo: this.route});
this.router.navigate(["../sibling"],   {relativeTo: this.route});
this.router.navigate(["./child"],      {relativeTo: this.route}); // or
this.router.navigate(["child"],        {relativeTo: this.route});

// with route param     ../sibling;abc=xyz
this.router.navigate(["../sibling", {abc: 'xyz'}], {relativeTo: this.route});
// with query param and fragment   ../sibling?p1=value1&p2=v2#frag
this.router.navigate(["../sibling"], {relativeTo: this.route, 
    queryParams: {p1: 'value', p2: 'v2'}, fragment: 'frag'});

// RC.5+: navigate without updating the URL 
this.router.navigate(["../sibling"], {relativeTo: this.route, skipLocationChange: true});
person Mark Rajcok    schedule 06.08.2016
comment
Почему навигация ведет себя иначе? - person Kugel; 10.11.2017
comment
у вас есть рабочий пример директивы [routerLink], работающей с родственным маршрутом? Он продолжает переключаться на абсолютный маршрут для меня, если я использую [routerLink] = ['../ sibling'] - person Jonathan002; 06.11.2018
comment
router.navigate () требует, чтобы первый аргумент был массивом, но ни один из них не работает даже как массив - person inorganik; 09.03.2019
comment
@ Jonathan002, то же самое для меня. Вы нашли что-нибудь, что работает? - person Marian Simonca; 12.11.2019
comment
Этот ответ не совсем точен. Путь ../something - это relativeTo, где компонент отображается в дереве маршрутизатора, но он не относится к текущему маршруту, потому что это может быть маршрут глубже в дереве маршрутов, откуда был применен [routerLink]. Если вы пытаетесь сделать хлебную крошку в качестве примера в заголовке своей страницы. Это будет относиться к тому, где отображается этот заголовок, и, скорее всего, не к тому, что вы хотите. - person Reactgular; 05.04.2020
comment
@Reactgular Тогда как лучше всего делать панировочные сухари? Использовать router.createUrlLink для создания абсолютной ссылки на основе currentRoute где-нибудь и использовать ее внутри ссылки маршрутизатора? - person Botis; 07.04.2020
comment
@Botis Я обновил свои хлебные крошки, прислушиваясь к изменениям в router.events и NavigationEnd, затем рекурсивно прохожу router.routerState.snapshot.root и восстанавливаю оттуда след хлебных крошек. Я проверяю, есть ли data, прикрепленный к дочерним элементам маршрута, чтобы увидеть, следует ли мне создать хлебную крошку для этого маршрута, а затем я конвертирую activatedRouteSnapshot.pathFromRoot в строку в качестве URL-адреса для этой крошки. Да, это очень сложно. К сожалению, лучшего способа найти не удалось. - person Reactgular; 07.04.2020