Angular'daki yönlendirme yollarından veri gönderme


182

Yine de verileri router.navigate ile parametre olarak göndermek için var mı? Demek istediğim, rotanın bir veri parametresi olduğunu görebileceğiniz gibi, bu örnek gibi bir şey , ama bunu yapmak çalışmıyor:

this.router.navigate(["heroes"], {some-data: "othrData"})

çünkü bazı veriler geçerli bir parametre değildir. Bunu nasıl yapabilirim? Parametreyi queryParams ile göndermek istemiyorum.


Sanırım $ state.go ('heroes', {some-data: "otherData"}) gibi bir şey yapabildiğimiz AngularJS'deki gibi başka bir yol olmalı.
Motomine


Benim yaklaşım npmjs.com/package/ngx-navigation-with-data son yorum, herkes için en iyisi
Virendra Yadav

Yanıtlar:


515

Bu konuda çok fazla karışıklık var çünkü bunu yapmanın pek çok farklı yolu var.

Aşağıdaki ekran görüntülerinde kullanılan uygun türler şunlardır:

private route: ActivatedRoute
private router: Router

1) Gerekli Yönlendirme Parametreleri:

resim açıklamasını buraya girin

2) Rota Opsiyonel Parametreleri:

resim açıklamasını buraya girin

3) Rota Sorgu Parametreleri:

resim açıklamasını buraya girin

4) Rota parametrelerini kullanmadan verileri bir bileşenden diğerine aktarmak için bir servisi kullanabilirsiniz.

Bir örnek için bkz. Https://blogs.msmvps.com/deborahk/build-a-simple-angular-service-to-share-data/

Burada bir dalgıç var: https://plnkr.co/edit/KT4JLmpcwGBM2xdZQeI9?p=preview


Cevabınız için teşekkür ederim! 2) ve 3) arasındaki fark nedir? Çünkü her ikisi de URL'ye "? Parametresi =" ekler. Bana 4) için bir örnek verebilir misiniz? Bunu nasıl yapacağımı anlayamıyorum.
Motomine

Farklı URL'leri göstermek ve bir hizmetle veri aktarma konusunda bir blog yayınına ve dalma aracına bağlantı sağlamak için yanıtla güncelledim. URL, yukarıda gösterildiği gibi isteğe bağlı ve sorgu parametreleriyle farklıdır. Ayrıca sorgu parametreleri güzergahlar boyunca korunabilir.
DeborahK

6
Ayrıca tüm bunları kapsayan yönlendirme konusunda bir Çoğulluk kursum var : app.pluralsight.com/library/courses/angular-routing/… Daha fazla bilgi edinmek isterseniz ücretsiz bir hafta için kaydolabilirsiniz.
DeborahK

3
Veriler yalnızca yürütme uygulaması içinde "paylaşılır". Kullanıcı sayfayı yenilerse, tüm uygulama sunucudan yeniden yüklenir, böylece uygulamada önceki durum korunmaz. Normal bir uygulama açısından düşünmek, bir kullanıcı yenilediğinde uygulamayı kapatmak ve yeniden açmak gibidir. Yenilemeden sonra durumu korumanız gerekiyorsa, yerel depolama veya sunucu üzerinde bir yerde saklamanız gerekir.
DeborahK

2
Sadece küçük bir ipucu: routetür ActivatedRoutedeğil Router.
Arsen Khachaturyan

156

Açısal 7.2.0 ile gelen yeni bir yöntem var

https://angular.io/api/router/NavigationExtras#state

gönder:

this.router.navigate(['action-selection'], { state: { example: 'bar' } });

at'a:

constructor(private router: Router) {
  console.log(this.router.getCurrentNavigation().extras.state.example); // should log out 'bar'
}

Bazı ek bilgileri buradan alabilirsiniz:

https://github.com/angular/angular/pull/27198

Yukarıdaki bağlantı yararlı olabilecek bu örneği içermektedir: https://stackblitz.com/edit/angular-bupuzn


11
Açısal 7'deki yeni özellikler göz önüne alındığında doğru cevap budur.
Randy

2
Bu yaklaşımla, bir tarayıcı yenilemesini kullanıcı tarafından nasıl halledebilirim? Bu durumda, navigasyon ekstralarındaki veriler kayboluyor gibi göründüğünden, yenilemede tekrar kullanma şansı yoktur.
tobi_b

1
@tobi_b Sanırım haklısın, yenilemeden sonra ona ulaşamazsın. Yenilemeden sonra ihtiyacınız varsa, kabul edilen cevaptaki yöntemler daha iyi olacaktır.
Véger Lóránd

3
Evet, bu yüzden verileri yalnızca yapıcıdaki this.router.getCurrentNavigation () öğesinden alabilirsiniz. Eğer ngOnInit () gibi başka bir yere ihtiyacınız varsa, veriye "history.state" üzerinden erişebilirsiniz. Dokümantasyondan: "Durum herhangi bir navigasyona geçti. Bu değer, bir navigasyon yürütülürken yönlendirici.getCurrentNavigation () öğesinden döndürülen ekstralar nesnesi aracılığıyla erişilebilir. Bir navigasyon tamamlandığında, bu değere location.state öğesine yazılır. Bu rota etkinleştirilmeden önce .go veya location.replaceState yöntemi çağrılır. "
Véger Lóránd

8
Ayrıca bir ekstra nesneyi ngOnInit()as olarak almaya çalışmadığınızdan emin olunthis.router.getCurrentNavigation().extras
hastrb

26

Açısalın son sürümü (7.2 +) artık NavigationExtras kullanarak ek bilgi aktarma seçeneğine sahip .

Ana bileşen

import {
  Router,
  NavigationExtras
} from '@angular/router';
const navigationExtras: NavigationExtras = {
  state: {
    transd: 'TRANS001',
    workQueue: false,
    services: 10,
    code: '003'
  }
};
this.router.navigate(['newComponent'], navigationExtras);

newComponent

test: string;
constructor(private router: Router) {
  const navigation = this.router.getCurrentNavigation();
  const state = navigation.extras.state as {
    transId: string,
    workQueue: boolean,
    services: number,
    code: string
  };
  this.test = "Transaction Key:" + state.transId + "<br /> Configured:" + state.workQueue + "<br /> Services:" + state.services + "<br /> Code: " + state.code;
}

Çıktı

resim açıklamasını buraya girin

Umarım bu yardımcı olur!


1

@ dev-nish Kodunuz küçük ayarlarla çalışır. yapmak

const navigationExtras: NavigationExtras = {
  state: {
    transd: 'TRANS001',
    workQueue: false,
    services: 10,
    code: '003'
  }
};

içine

let navigationExtras: NavigationExtras = {
  state: {
    transd: '',
    workQueue: ,
    services: ,
    code: ''
  }
};

özel olarak bir tür veri göndermek istiyorsanız, örneğin bir form dolgusunun sonucu olarak JSON, verileri daha önce açıklandığı şekilde gönderebilirsiniz.


0

NavigateExtra'da bağımsız değişken olarak yalnızca belirli bir adı geçebiliriz, aksi takdirde aşağıdaki gibi hata gösterir: Ex için - Burada yönlendirici navigasyonunda müşteri anahtarını geçmek istiyorum ve bu şekilde geçiyorum

this.Router.navigate(['componentname'],{cuskey: {customerkey:response.key}});

ancak aşağıdaki gibi bir hata gösteriyor:

Argument of type '{ cuskey: { customerkey: any; }; }' is not assignable to parameter of type 'NavigationExtras'.
  Object literal may only specify known properties, and 'cuskey' does not exist in type 'NavigationExt## Heading ##ras'

.

Çözüm: Bu şekilde yazmak zorundayız:

this.Router.navigate(['componentname'],{state: {customerkey:response.key}});

-2

Bunun için internette bulduğum en iyi şey veri ile ngx-navigation-navigation . Verilerin bir bileşenden başka bir bileşene yönlendirilmesi çok basit ve iyidir. Bileşen sınıfını içe aktarmanız ve çok basit bir şekilde kullanmanız gerekir. Evinizde ve bileşeniniz olduğunu varsayalım ve veri göndermek istediğinizi varsayalım

EV BİLEŞENİ

import { Component, OnInit } from '@angular/core';
import { NgxNavigationWithDataComponent } from 'ngx-navigation-with-data';

@Component({
 selector: 'app-home',
 templateUrl: './home.component.html',
 styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {

constructor(public navCtrl: NgxNavigationWithDataComponent) { }

 ngOnInit() {
 }

 navigateToABout() {
  this.navCtrl.navigate('about', {name:"virendta"});
 }

}

BİLEŞEN HAKKINDA

import { Component, OnInit } from '@angular/core';
import { NgxNavigationWithDataComponent } from 'ngx-navigation-with-data';

@Component({
 selector: 'app-about',
 templateUrl: './about.component.html',
 styleUrls: ['./about.component.css']
})
export class AboutComponent implements OnInit {

 constructor(public navCtrl: NgxNavigationWithDataComponent) {
  console.log(this.navCtrl.get('name')); // it will console Virendra
  console.log(this.navCtrl.data); // it will console whole data object here
 }

 ngOnInit() {
 }

}

Herhangi bir sorgu için https://www.npmjs.com/package/ngx-navigation-with-data adresini takip edin

Yardım için yorum yapın.


Verileri param şeklinde mi yoksa sadece arka planda mı aktarıyor?
Marium Malik

@MariumMalik'i anlayamadım Lütfen açıklayıcı bir şekilde sorabilir misiniz?
Virendra Yadav

Yes it does @MariumMalik
Virendra Yadav

3
"İnternette buldum" yerine bunun yazarı gibi mi görünüyorsunuz? Ayrıca, benzer işlevselliği uygulayan Angular 7 iş parçacığına spam göndermemeniz isteniyor ( github.com/angular/angular/pull/27198 )
IrishDubGuy
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.