web-dev-qa-db-ja.com

子ルートから親ルートに移動するにはどうすればよいですか?

私の問題は非常に古典的です。 login formの背後にあるアプリケーションのプライベート部分があります。ログインが成功すると、管理アプリケーションの子ルートに移動します。

私の問題は、ルーターがAdminComponentではなくAppCompomentをルーティングしようとするため、global navigation menuを使用できないことです。だから私のナビゲーションは壊れています。

別の問題は、誰かがURLに直接アクセスしたい場合、親の「ログイン」ルートにリダイレクトしたいということです。しかし、私はそれを機能させることはできません。これらの2つの問題は似ているように思えます。

どのようにそれを行うことができますか?

55
Carl Boisvert

リンク/ 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],

Imperativenavigate()メソッドには開始点(つまり、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});
110
Mark Rajcok

これは2017年春の時点で私にとってうまくいくようです:

goBack(): void {
  this.router.navigate(['../'], { relativeTo: this.route });
}

コンポーネントctorがActivatedRouteおよびRouterを受け入れる場合、次のようにインポートされます。

import { ActivatedRoute, Router } from '@angular/router';

32
ne1410s

このように親ルートに移動できます

this.router.navigate(['.'], { relativeTo: this.activeRoute.parent });

コンストラクターに現在アクティブなルートを注入する必要があります

constructor(
    private router: Router,
    private activeRoute: ActivatedRoute) {

  }
9
Chris Lamothe

親に移動するには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も。)

6
kayjtea
constructor(private router: Router) {}

navigateOnParent() {
  this.router.navigate(['../some-path-on-parent']);
}

ルーターはサポートします

  • 絶対パス/xxx-ルートコンポーネントのルーターで開始
  • 相対パスxxx-現在のコンポーネントのルーターで開始
  • 相対パス../xxx-現在のコンポーネントの親ルーターで開始
4

@angular/commonからコンストラクタにLocationを追加します

constructor(private _location: Location) {}

バック関数を追加します。

back() {
  this._location.back();
}

そしてあなたの意見では:

<button class="btn" (click)="back()">Back</button>
1
user3021615

別の方法は次のようになります

this._router.navigateByUrl(this._router.url.substr(0, this._router.url.lastIndexOf('/'))); // go to parent URL

そして、ここはコンストラクタです

constructor(
    private _activatedRoute: ActivatedRoute,
    private _router: Router
  ) { }
0
Johansrk

私のルートには次のようなパターンがあります。

  • user/edit/1->編集
  • user/create/0->作成
  • ユーザー/->リスト

たとえば、[編集]ページにいて、リストページに戻る必要がある場合、ルートの2レベル上に戻ります。

それについて考えて、「レベル」パラメーターを使用してメソッドを作成しました。

goBack(level: number = 1) {
    let commands = '../';
    this.router.navigate([commands.repeat(level)], { relativeTo: this.route });
}

だから、編集からリストに移動するには、そのようなメソッドを呼び出します:

this.goBack(2);
0
Carlinhos