Bir alt rotadan bir ana rotaya nasıl giderim?


94

Benim sorunum oldukça klasik. Bir uygulamanın arkasında bir login form. Giriş başarılı olduğunda, yönetici uygulaması için bir alt rotaya gider.

Benim sorunum, global navigation menuyönlendirici benim AdminComponentyerine benim yönlendirmeye çalıştığı için kullanamıyorum AppCompoment. Yani navigasyonum bozuk.

Diğer bir sorun da, birisi URL'ye doğrudan erişmek isterse, ana "giriş" yoluna yeniden yönlendirmek istememdir. Ama çalışmasını sağlayamam. Bana öyle geliyor ki bu iki konu birbirine benziyor.

Nasıl yapılabileceği hakkında bir fikriniz var mı?


3
lütfen biraz kod ekleyin
Jiang YD

Yanıtlar:


157

Bir bağlantı / HTML mi istiyorsunuz yoksa zorunlu olarak / kod içinde mi yönlendirmek istiyorsunuz?

Bağlantı : RouterLink yönergesi, sağlanan bağlantıyı her zaman geçerli URL'ye bir delta olarak ele alır:

[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 ile, directivesdiziyi içe aktarmayı ve kullanmayı unutmayın :

import { ROUTER_DIRECTIVES } from '@angular/router';
@Component({
    directives: [ROUTER_DIRECTIVES],

Zorunlu : navigate()Yöntem bir başlangıç ​​noktası (yani relativeToparametre) gerektirir. Hiçbiri sağlanmadıysa, gezinme mutlaktır:

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});

1
router.navigate(string)yöntem açısal geçerli sürümünde (2.2) mevcut görünmüyor. Dokümanlarda aradım ve sadece buldum navigate(commands: any[], extras?: NavigationExtras) : Promise<boolean>. Yoksa tamamen bir şey mi kaçırıyorum?
Tomato

2
@Tomato, rotaların etrafına [] koymanız gerekiyor. Örneğin, this.router.navigate (["../../ parent"], {relativeTo: this.route});
gye

2
relativeTohtml'de typecript yerine [routerLink] kullandığınızda verileri nasıl iletirsiniz?
redfox05

hizmetlerle aynı mı?
oCcSking

Bazı nedenlerden dolayı, benim durumumda ebeveyne ( nereden ) gitmek ../../../yerine kullanmak zorundayım . ../'/users''/users/1'
nelson6e65

49

Bu, 2017 İlkbaharından itibaren benim için işe yarıyor gibi görünüyor:

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

Bileşen ctor'unuzun kabul ettiği ActivatedRouteve Routeraşağıdaki gibi ithal edildiği yer:

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


4
Bir tarih yerine, kullanmakta olduğunuz Açısal versiyondan bahsetmek daha faydalı olacaktır.
isherwood

@isherwood Katılıyorum. Özür dilerim. Doğru hatırlıyorsam, bunu Angular 4.0.x için yazdım ve 4.3.x'te hala işlevseldi. Maalesef şimdi
Angular'dan

@ ne1410s Teşekkürler çok akraba eksikti: this.route
Ian Samz

Not: Geç yüklü modüllerde ek yönlendirici segmentleriyle çalışmayacaktır. EX:: parentPath'work: queue' (çocuklara sahiptir) ve alt modülü parametrelerle yükler. fullCurrentPath: 'iş / nakliye / modül / liste'. Yukarıdaki kod yükleyemediği parentPathden fullCurrentPath.
Don Thomas Boyle

34

Bunun gibi ana köküne gidebilirsin

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

Yapıcıya mevcut aktif Rotayı enjekte etmeniz gerekecek

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

  }

2
Bazı açıklamalar eklemek bu cevabı daha kullanışlı hale getirecektir.
Sagar Zala

Birçok kişi bu.router.navigate (["../ sibling"], {relativeTo: this.route}) ile kardeşe gitmenizi önerir. Ancak bu artık çalışmıyor. Bu cevabı muhtemelen işe yaradığını buldum. Ebeveyne gitmek için "../" kullanmak yerine. göreli değiştirmek için this.route to this.route.parent doğru yoldur
Terry Lam

1
@ChrisLamothe: Oh evet bir hata yaptım. Genel durumda çalışır. Ancak yardımcı rotalarda çalışmaz. Bu, this.router.navigate (['../ sibling']) çalıştığı ancak this.router.navigate ([{outlets: {'ikincil': ['../sibling']}}]) çalıştığı anlamına gelir. Yardımcı yönlendirmede this.router.navigate ([{outlets: {'ikincil': ['sibling']}}], {relativeTo: this.activatedRoute.parent}) kullanmalıyım.
Terry Lam

2
Ayrıca, this.router.navigate(['.'], {relativeTo: this.activeRoute.parent});aynı bileşeni iki yolda kullandığınızda bu yanıttaki gezinme yöntemi doğru şekilde çalışacaktır: / users / create ve / users / edit / 123. Her iki durumda da ebeveyn / kullanıcılara gidecektir. İle normal gezinme this.router.navigate([".."], {relativeTo: this.activeRoute})yalnızca / create kullanıcıları için çalışır, ancak / edit / 123 kullanıcıları için çalışmaz çünkü mevcut olmayan / users / edit / route konumuna gidecektir.
Roganik

1
Bir alternatif için +1, ancak kişisel olarak, ben biraz bayt kovalayıcısıyım ve [".."] parametresine , {relativeTo: this.route} 'a yapılan referansı ortadan kaldırmak için fazladan bir nokta koyacağım .
Konrad Viltersten

7
constructor(private router: Router) {}

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

Yönlendirici destekler

  • mutlak yollar /xxx- kök bileşenin yönlendiricisinde başlatıldı
  • göreli yollar xxx- mevcut bileşenin yönlendiricisinde başlatıldı
  • göreli yollar ../xxx- mevcut bileşenin üst yönlendiricisinde başlatılır

Bu kod soruyu yanıtlayabilse de, ilgili ek bağlam sağlar. neden ve / veya nasıl yanıtladığına , uzun vadeli değerini önemli ölçüde artıracaktır. Lütfen bir açıklama eklemek için cevabınızı düzenleyin .
Toby Speight

1
@TobySpeight Yeterince adil. Ben kabul ../yeterince bilinmektedir, ama sonunda yine de belirsiz kalıyor. İpucu için teşekkürler.
Günter Zöchbauer

1
Cevabınız için teşekkürler, bir süredir bu web sitesi üzerinde çalışıyorum, bu yüzden Angular açıkça o zamandan beri güncellendi. Bu çözümü mevcut sürümümde denedim ve çalışmıyor. Güncellememe izin verin, sonra tekrar yorum yapacağım.
Carl Boisvert

1
Kodunuzun beklendiği gibi çalışmasını sağlayamıyorum. Ancak, gezinme çağrısına ikinci bir parametre olarak açıkça , {relativeTo: this.route} ' u ekleyerek çalışır. Cevaplarınızın genellikle aşırı derecede doğruluk derecesine sahip olması gerçeği olmasaydı, bunu aptalca bir yazım hatası olarak sayardım. Yanıt verildiğinden beri yönlendiricinin davranışında bir değişiklik olabilir mi (3.6 yıl önce, Angular yıllarında yarım 'sonsuzluk gibi)?
Konrad Viltersten

Bu eski bir cevap ve yönlendirici şu anda çok değişti. Sanırım cevabım, daha fazla oy içeren birkaç cevap olduğu düşünüldüğünde modası geçmiş. Artık o kadar fazla web kullanıcı arayüzü işi yapmıyorum ve tüm ayrıntılar kafamın üstünde yok.
Günter Zöchbauer

6

Geçerli rotadaki veya ana rotadaki parametre sayısından bağımsız olarak üst bileşene gitmek için : Angular 6 güncelleme 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);

Bu, singleton Router ile kullanabileceğiniz mutlak bir rota olma ek avantajına sahiptir.

(Kesinlikle Açısal 4+, muhtemelen Açısal 2 de.)


esrarlı, bu her zaman boş bir dizi döndürür ve aynı sonucu elde this._router.navigate([])ederken, this._router.navigate([[]])ana rota kök kendisi değil ancak ve ancak, ana yoluna götürür.
Ashish Jhanwar

kod, Angular 6 değişikliklerini ve rotalarda çocukları içeren ebeveyn ve çocuk ile uygun ebeveyn bulgusunu yansıtacak şekilde güncellendi.
Don Thomas Boyle

Bunun kullanım alanınıza özgü olmadığından emin misiniz? Görünüşe göre, son yolu eklemek ['siparişler', '123', 'öğeler', 1] 'i sadece [' siparişlere '] dönüştürecek, ki bu hiç doğru görünmüyor. Her durumda, Angular 5'ten 7'ye gittik ve bu kodlu değere dokunmadık.
kayjtea

onların sayfamdaki div sayısıdır .. her div tıklamasında sorgu parametrelerini geçiririm ve bir bileşen yüklerim. şimdi tarayıcı geri düğmesini kullanarak bunu nasıl yapacağıma geri dönmek istiyorum?
Vrajendra Singh Mandloi

4

Başka bir yol böyle olabilir

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

ve işte kurucu

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

4

çok uzatmadan:

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

'..' parametresi gezinmeyi bir seviye yukarı yapar, yani ana :)


SkipLocationChange'in amacından / ihtiyacından bahsetmek isteyebilirsiniz .
Konrad Viltersten

1

Rotalarımın şuna benzer bir düzeni var:

  • kullanıcı / düzenle / 1 -> Düzenle
  • kullanıcı / oluştur / 0 -> Oluştur
  • kullanıcı / -> Liste

Örneğin, Düzenleme sayfasındayken ve liste sayfasına geri dönmem gerektiğinde, rotada 2 seviye yukarı döneceğim.

Bunu düşünerek yöntemimi bir "level" parametresi ile oluşturdum.

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

Yani, düzenlemeden listeye gitmek için şu yöntemi çağırıyorum:

this.goBack(2);

0

UiSref direktifini kullanıyorsanız, bunu yapabilirsiniz

uiSref="^"

0

Benim çözümüm:

const urlSplit = this._router.url.split('/');
this._router.navigate([urlSplit.splice(0, urlSplit.length - 1).join('/')], { relativeTo: this._route.parent });

Ve Routerenjeksiyon:

private readonly _router: Router

0

Bunların hiçbiri benim için işe yaramadı ... Kullanmam gerekiyordu:

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

private router: Router

this.router.navigate([this.router.url.substring(0, this.router.url.lastIndexOf('/'))]);

Lütfen yanıtınızı bunun neden işe yaradığını açıklayarak güncelleyin. Lütfen Nasıl Cevaplanacağına bakın .
Gerald Zehetner

-2

kurucunuza şuradan Konum ekleyin: @angular/common

constructor(private _location: Location) {}

geri işlevi ekleyin:

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

ve sonra sizin görüşünüzde:

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

5
Bu, yalnızca daha önce ana rotadaysanız çalışır. Ana yolların tarayıcı geçmişiyle ilgisi yok ...
leviathanbadger

geri döner, ancak bileşenin üst öğesine gitmez
Andrew Andreev

Bu kullanılmamalıdır, eğer kullanıcı bileşene harici bir siteden girerse, o siteye geri götürülür. Bu kod, 1
18'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.