私の問題は非常に古典的です。 login form
の背後にあるアプリケーションのプライベート部分があります。ログインが成功すると、管理アプリケーションの子ルートに移動します。
私の問題は、ルーターがAdminComponent
ではなくAppCompoment
をルーティングしようとするため、global navigation menu
を使用できないことです。だから私のナビゲーションは壊れています。
別の問題は、誰かがURLに直接アクセスしたい場合、親の「ログイン」ルートにリダイレクトしたいということです。しかし、私はそれを機能させることはできません。これらの2つの問題は似ているように思えます。
どのようにそれを行うことができますか?
リンク/ HTMLが必要ですか、それとも命令的/コードでルーティングしますか?
Link: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],
Imperative: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});
これは2017年春の時点で私にとってうまくいくようです:
goBack(): void {
this.router.navigate(['../'], { relativeTo: this.route });
}
コンポーネントctorがActivatedRoute
およびRouter
を受け入れる場合、次のようにインポートされます。
import { ActivatedRoute, Router } from '@angular/router';
このように親ルートに移動できます
this.router.navigate(['.'], { relativeTo: this.activeRoute.parent });
コンストラクターに現在アクティブなルートを注入する必要があります
constructor(
private router: Router,
private activeRoute: ActivatedRoute) {
}
親に移動するにはcomponent現在のルートまたは親ルートのパラメーターの数に関係なく: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);
これには、シングルトンルーターで使用できる絶対ルートであるという追加のボーナスがあります。
(確かにAngular 4+、おそらくAngular 2も。)
constructor(private router: Router) {}
navigateOnParent() {
this.router.navigate(['../some-path-on-parent']);
}
ルーターはサポートします
/xxx
-ルートコンポーネントのルーターで開始xxx
-現在のコンポーネントのルーターで開始../xxx
-現在のコンポーネントの親ルーターで開始@angular/common
からコンストラクタにLocationを追加します
constructor(private _location: Location) {}
バック関数を追加します。
back() {
this._location.back();
}
そしてあなたの意見では:
<button class="btn" (click)="back()">Back</button>
別の方法は次のようになります
this._router.navigateByUrl(this._router.url.substr(0, this._router.url.lastIndexOf('/'))); // go to parent URL
そして、ここはコンストラクタです
constructor(
private _activatedRoute: ActivatedRoute,
private _router: Router
) { }
私のルートには次のようなパターンがあります。
たとえば、[編集]ページにいて、リストページに戻る必要がある場合、ルートの2レベル上に戻ります。
それについて考えて、「レベル」パラメーターを使用してメソッドを作成しました。
goBack(level: number = 1) {
let commands = '../';
this.router.navigate([commands.repeat(level)], { relativeTo: this.route });
}
だから、編集からリストに移動するには、そのようなメソッドを呼び出します:
this.goBack(2);