Как перейти к родительскому маршруту из дочернего маршрута?
Моя проблема довольно классическая. У меня есть частная часть приложения, которое находится за login form
. Когда вход успешно завершен, он переходит к дочернему маршруту для приложения администратора.
Моя проблема в том, что я не могу использовать global navigation menu
, потому что маршрутизатор пытается маршрутизировать в моем AdminComponent
вместо моего AppCompoment
. Поэтому моя навигация сломана.
Другая проблема заключается в том, что если кто-то хочет получить доступ к URL-адресу напрямую, я хочу перенаправить на родительский маршрут входа. Но я не могу заставить его работать. Мне кажется, что тезисы похожи на два вопроса.
Любая идея, как это можно сделать?
Ответы
Ответ 1
Вы хотите ссылку /HTML или вы хотите направить/в коде?
Ссылка: директива RouterLink всегда обрабатывает предоставленную ссылку как дельту текущего URL:
[routerLink]="['/absolute']"
[routerLink]="['../../parent']"
[routerLink]="['../sibling']"
[routerLink]="['./child']" // or
[routerLink]="['child']"
// with route param ../../parent;abc=xyz
[routerLink]="['../../parent', {abc: 'xyz'}]"
// with query param and fragment ../../parent?p1=value1&p2=v2#frag
[routerLink]="['../../parent']" [queryParams]="{p1: 'value', p2: 'v2'}" fragment="frag"
С RouterLink не забудьте импортировать и использовать массив directives
:
import { ROUTER_DIRECTIVES } from '@angular/router';
@Component({
directives: [ROUTER_DIRECTIVES],
ОБЯЗАТЕЛЬНЫЕ ДЕЙСТВИЯ: navigate()
метод требует начальной точки (т.е. relativeTo
параметра). Если ничего не указано, навигация является абсолютной:
import { Router, ActivatedRoute } from '@angular/router';
...
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 ../../parent;abc=xyz
this.router.navigate(["../../parent", {abc: 'xyz'}], {relativeTo: this.route});
// with query param and fragment ../../parent?p1=value1&p2=v2#frag
this.router.navigate(["../../parent"], {relativeTo: this.route,
queryParams: {p1: 'value', p2: 'v2'}, fragment: 'frag'});
// navigate without updating the URL
this.router.navigate(["../../parent"], {relativeTo: this.route, skipLocationChange: true});
Ответ 2
Кажется, это работает для меня как Spring 2017:
goBack(): void {
this.router.navigate(['../'], { relativeTo: this.route });
}
Если ваш компонент ctor принимает ActivatedRoute
и Router
, импортируется следующим образом:
import { ActivatedRoute, Router } from '@angular/router';
Ответ 3
Чтобы перейти к родительскому компоненту независимо от количества параметров в текущем или родительском маршруте: Angular 6 update 21.01.19
let routerLink = this._aRoute.parent.snapshot.pathFromRoot
.map((s) => s.url)
.reduce((a, e) => {
//Do NOT add last path!
if (a.length + e.length !== this._aRoute.parent.snapshot.pathFromRoot.length) {
return a.concat(e);
}
return a;
})
.map((s) => s.path);
this._router.navigate(routerLink);
Это дает дополнительный бонус в виде абсолютного маршрута, который вы можете использовать с одноэлементным маршрутизатором.
(Angular 4+ наверняка, возможно Angular 2 тоже.)
Ответ 4
Вы можете перейти к своему родительскому корню, как это
this.router.navigate(['.'], { relativeTo: this.activeRoute.parent });
Вам нужно будет ввести текущий активный маршрут в конструктор
constructor(
private router: Router,
private activeRoute: ActivatedRoute) {
}
Ответ 5
constructor(private router: Router) {}
navigateOnParent() {
this.router.navigate(['../some-path-on-parent']);
}
Роутер поддерживает
- абсолютные пути
/xxx
- запущены на маршрутизаторе корневого компонента - относительные пути
xxx
- запущены на маршрутизаторе текущего компонента - относительные пути
../xxx
- запущены на родительском маршрутизаторе текущего компонента
Ответ 6
добавьте Location в ваш конструктор из @angular/common
constructor(private _location: Location) {}
добавьте функцию возврата:
back() {
this._location.back();
}
а потом по вашему мнению:
<button class="btn" (click)="back()">Back</button>
Ответ 7
Мои маршруты имеют такую схему:
- пользователь /edit/1 → Edit
- user/create/0 → Create
- пользователь / -> Список
Например, когда я нахожусь на странице редактирования и мне нужно вернуться на страницу списка, я вернусь на 2 уровня вверх по маршруту.
Размышляя об этом, я создал свой метод с параметром "level".
goBack(level: number = 1) {
let commands = '../';
this.router.navigate([commands.repeat(level)], { relativeTo: this.route });
}
Итак, чтобы перейти от редактирования к списку, я вызываю метод следующим образом:
this.goBack(2);
Ответ 8
Другой способ может быть таким
this._router.navigateByUrl(this._router.url.substr(0, this._router.url.lastIndexOf('/'))); // go to parent URL
а вот и конструктор
constructor(
private _activatedRoute: ActivatedRoute,
private _router: Router
) { }