Mein Problem ist ganz klassisch. Ich habe einen privaten Teil einer Anwendung, der sich hinter einem login form
Befindet. Wenn die Anmeldung erfolgreich ist, wird eine untergeordnete Route für die Administratoranwendung aufgerufen.
Mein Problem ist, dass ich den global navigation menu
Nicht verwenden kann, da der Router versucht, in meinem AdminComponent
anstelle meines AppCompoment
zu routen. Also ist meine Navigation kaputt.
Ein weiteres Problem ist, dass, wenn jemand direkt auf die URL zugreifen möchte, ich zur übergeordneten "Login" -Route umleiten möchte. Aber ich kann es nicht zum Laufen bringen. Mir scheint, dass diese beiden Themen ähnlich sind.
Irgendeine Idee, wie es gemacht werden kann?
Möchten Sie einen Link/HTML-Code oder möchten Sie unbedingt/im Code weiterleiten?
Link: Die RouterLink-Direktive behandelt den angegebenen Link immer als Delta zur aktuellen 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"
Denken Sie bei RouterLink daran, das Array directives
zu importieren und zu verwenden:
import { ROUTER_DIRECTIVES } from '@angular/router';
@Component({
directives: [ROUTER_DIRECTIVES],
Imperativ: Die Methode navigate()
erfordert einen Startpunkt (d. H. Den Parameter relativeTo
). Wenn keine angegeben ist, ist die Navigation absolut:
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});
Dies scheint für mich ab Frühjahr 2017 zu funktionieren:
goBack(): void {
this.router.navigate(['../'], { relativeTo: this.route });
}
Wobei Ihre Komponente ctor ActivatedRoute
und Router
akzeptiert, die wie folgt importiert werden:
import { ActivatedRoute, Router } from '@angular/router';
Sie können auf diese Weise zu Ihrem übergeordneten Stammverzeichnis navigieren
this.router.navigate(['.'], { relativeTo: this.activeRoute.parent });
Sie müssen die aktuell aktive Route in den Konstruktor einfügen
constructor(
private router: Router,
private activeRoute: ActivatedRoute) {
}
So navigieren Sie zum übergeordneten Element Komponente, unabhängig von der Anzahl der Parameter in der aktuellen Route oder der übergeordneten Route: Angular 6 Update 1/21/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);
Dies hat den zusätzlichen Vorteil, dass es sich um eine absolute Route handelt, die Sie mit dem Singleton Router verwenden können.
(Angular 4+ sicher, wahrscheinlich Angular 2 auch.)
constructor(private router: Router) {}
navigateOnParent() {
this.router.navigate(['../some-path-on-parent']);
}
Der Router unterstützt
/xxx
- auf dem Router der Root-Komponente gestartetxxx
- auf dem Router der aktuellen Komponente gestartet../xxx
- wurde auf dem übergeordneten Router der aktuellen Komponente gestartetfüge Location aus @angular/common
zu deinem Konstruktor hinzu
constructor(private _location: Location) {}
füge die back Funktion hinzu:
back() {
this._location.back();
}
und dann aus Ihrer Sicht:
<button class="btn" (click)="back()">Back</button>
Ein anderer Weg könnte so sein
this._router.navigateByUrl(this._router.url.substr(0, this._router.url.lastIndexOf('/'))); // go to parent URL
und hier ist der Konstruktor
constructor(
private _activatedRoute: ActivatedRoute,
private _router: Router
) { }
Meine Routen haben folgendes Muster:
Wenn ich zum Beispiel auf Seite bearbeiten bin und zur Listenseite zurückkehren muss, kehre ich auf der Route 2 Ebenen zurück.
In diesem Sinne habe ich meine Methode mit einem "Level" -Parameter erstellt.
goBack(level: number = 1) {
let commands = '../';
this.router.navigate([commands.repeat(level)], { relativeTo: this.route });
}
Um von der Bearbeitung zur Liste zu gelangen, rufe ich die Methode folgendermaßen auf:
this.goBack(2);