Invia dati tramite percorsi di routing in Angolare


182

Esiste un modo per inviare i dati come parametro con router.navigate? Voglio dire, qualcosa come questo esempio, come puoi vedere il percorso ha un parametro di dati, ma facendo questo non funziona:

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

perché some-data non è un parametro valido. Come lo posso fare? Non voglio inviare il parametro con queryParams.


Penso che dovrebbe essere diversamente da AngularJS, dove siamo stati in grado di fare qualcosa come $ state.go ('heroes', {some-data: "otherData"})
Motomine,

3 semplici modi per condividere i dati attraverso i percorsi - angulartutorial.net/2017/12/…
Prashobh

Usa il mio approccio npmjs.com/package/ngx-navigation-with-data ultimo commento da parte mia, il migliore per tutti
Virendra Yadav,

Risposte:


517

C'è molta confusione su questo argomento perché ci sono molti modi diversi per farlo.

Ecco i tipi appropriati utilizzati nelle seguenti schermate:

private route: ActivatedRoute
private router: Router

1) Parametri di routing richiesti:

inserisci qui la descrizione dell'immagine

2) Instradare i parametri opzionali:

inserisci qui la descrizione dell'immagine

3) Parametri query percorso:

inserisci qui la descrizione dell'immagine

4) È possibile utilizzare un servizio per passare i dati da un componente a un altro senza utilizzare i parametri di route.

Per un esempio, vedere: https://blogs.msmvps.com/deborahk/build-a-simple-angular-service-to-share-data/

Ne ho un plunker qui: https://plnkr.co/edit/KT4JLmpcwGBM2xdZQeI9?p=preview


La ringrazio per la risposta! Qual è la differenza tra 2) e 3)? Perché entrambi finiscono per aggiungere "? Parametro =" nell'URL. Potresti darmi un esempio per il 4)? Non riesco a capire come farlo.
Motomine,

Ho aggiornato per risposta per mostrare i diversi URL e per fornire un collegamento a un post di blog e plunker su come passare i dati con un servizio. L'URL è diverso con i parametri facoltativi e di query come mostrato sopra. Inoltre, i parametri della query possono essere conservati su tutte le rotte.
DeborahK,

6
Ho anche un corso Pluralsight sull'instradamento che copre tutto questo: app.pluralsight.com/library/courses/angular-routing/… Puoi iscriverti per una settimana gratuita se sei interessato a ulteriori informazioni.
DeborahK,

3
I dati vengono "condivisi" solo all'interno dell'applicazione in esecuzione. Se l'utente aggiorna la pagina, l'intera applicazione viene ricaricata dal server, quindi nell'applicazione non viene mantenuto alcuno stato precedente. Pensandoci in termini di un'applicazione normale, quando un utente lo aggiorna è come chiudere e riaprire l'applicazione. Se è necessario conservare lo stato dopo un aggiornamento, sarà necessario memorizzarlo in un luogo come l'archiviazione locale o sul server.
DeborahK,

2
Solo un piccolo suggerimento: il routetipo è ActivatedRoute, non Router.
Arsen Khachaturyan,

156

Esiste un nuovo metodo fornito con Angular 7.2.0

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

Spedire:

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

ricevere:

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

Puoi trovare alcune informazioni aggiuntive qui:

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

Il link sopra contiene questo esempio, cosa può essere utile: https://stackblitz.com/edit/angular-bupuzn


11
Questa è la risposta corretta date le nuove funzionalità di Angular 7.
Randy,

2
Con questo approccio, come gestirò un aggiornamento del browser da parte dell'utente? In tal caso, i dati negli extra di navigazione sembrano scomparire, quindi non è possibile riutilizzarli per l'aggiornamento.
tobi_b

1
@tobi_b Penso che tu abbia ragione, dopo l'aggiornamento non puoi raggiungerlo. Se ne hai bisogno dopo l'aggiornamento, i metodi nella risposta accettata saranno migliori.
Véger Lóránd,

3
Sì, è per questo che puoi ottenere solo i dati da this.router.getCurrentNavigation () nel costruttore. Se ne hai bisogno altrove come all'interno di ngOnInit () puoi accedere ai dati tramite "history.state". Dalla documentazione: "Stato passato a qualsiasi navigazione. Questo valore sarà accessibile tramite l'oggetto extra restituito da router.getCurrentNavigation () durante l'esecuzione di una navigazione. Una volta completata la navigazione, questo valore verrà scritto in history.state quando la posizione Il metodo .go o location.replaceState viene chiamato prima dell'attivazione di questa route. "
Véger Lóránd

8
Assicurati anche di non provare a ricevere un oggetto extra in ngOnInit()asthis.router.getCurrentNavigation().extras
hastrb il

26

L'ultima versione di angolare (7.2 +) ora ha la possibilità di trasmettere informazioni aggiuntive usando NavigationExtras .

Componente domestico

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

Produzione

inserisci qui la descrizione dell'immagine

Spero che questo possa aiutare!


1

@ dev-nish Il tuo codice funziona con piccole modifiche. fare il

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

in

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

quindi se si desidera inviare in modo specifico un tipo di dati, ad esempio JSON a seguito della compilazione di un modulo, è possibile inviare i dati come spiegato in precedenza.


0

In navigateExtra possiamo passare solo un nome specifico come argomento, altrimenti mostra un errore come di seguito: Per Ex- Qui voglio passare la chiave cliente nella navigazione del router e passo così-

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

ma mostra alcuni errori come di seguito:

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'

.

Soluzione: dobbiamo scrivere così:

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

-2

Il migliore che ho trovato su Internet per questo è ngx-navigation-with-data . È molto semplice e buono per la navigazione dei dati da un componente a un altro componente. Devi solo importare la classe del componente e usarla in modo molto semplice. Supponiamo che tu abbia la casa e il componente e che desideri inviare i dati

COMPONENTE DOMESTICO

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

}

INFORMAZIONI SUL COMPONENTE

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() {
 }

}

Per qualsiasi domanda segui https://www.npmjs.com/package/ngx-navigation-with-data

Commenta per chiedere aiuto.


Trasferisce i dati sotto forma di parametri o solo in background?
Marium Malik,

Non riuscivo a capire @MariumMalik Puoi per favore chiedere in modo descrittivo?
Virendra Yadav,

Sì, fa @MariumMalik
Virendra Yadav,

3
Sembri essere l'autore di questo, piuttosto che "Ho trovato su Internet"? Ti viene anche chiesto di non
spammarlo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.