378 votes

Envoyer des données par des chemins de routage en Angular

Existe-t-il un moyen d'envoyer des données en tant que paramètre avec router.navigate ? Je veux dire, quelque chose comme este Comme vous pouvez le voir, la route a un paramètre de données, mais en faisant cela, cela ne fonctionne pas :

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

parce que certaines données ne sont pas un paramètre valide. Comment puis-je faire cela ? Je ne veux pas envoyer le paramètre avec queryParams.

0 votes

Je pense qu'il devrait y avoir un autre moyen comme dans AngularJS, où nous avons pu faire quelque chose comme $state.go('heroes', {quelques données : "otherData"})

0 votes

3 façons simples de partager des données par le biais de routes - angulartutorial.net/2017/12/

0 votes

Utilisez mon approche npmjs.com/package/ngx-navigation-with-data dernier commentaire de ma part, le meilleur pour tous

888voto

DeborahK Points 22809

Il y a beaucoup de confusion sur ce sujet car il y a tellement de façons différentes de procéder.

Voici les types appropriés utilisés dans les captures d'écran suivantes :

private route: ActivatedRoute
private router: Router

1) Paramètres de routage requis :

enter image description here

2) Paramètres facultatifs de l'itinéraire :

enter image description here

3) Paramètres de requête de route :

enter image description here

4) Vous pouvez utiliser un service pour transmettre des données d'un composant à un autre sans utiliser de paramètres de route.

Pour un exemple, voir : https://blogs.msmvps.com/deborahk/build-a-simple-angular-service-to-share-data/

J'en ai un exemplaire ici : https://plnkr.co/edit/KT4JLmpcwGBM2xdZQeI9?p=preview

4 votes

Merci pour votre réponse ! Quelle est la différence entre le 2) et le 3) ? Parce que les deux finissent par ajouter "?parameter=" dans l'URL. Pourriez-vous me donner un exemple pour le point 4) ? Je n'arrive pas à trouver comment le faire.

0 votes

J'ai mis à jour ma réponse pour montrer les différentes URL et pour fournir un lien vers un article de blog et un plunker sur la façon de transmettre des données avec un service. L'URL est différente avec les paramètres optionnels et les paramètres de requête comme indiqué ci-dessus. De plus, les paramètres d'interrogation peuvent être conservés dans toutes les routes.

10 votes

J'ai également un cours Pluralsight sur le routage qui couvre tout cela : app.pluralsight.com/library/courses/angular-routing/ Vous pouvez vous inscrire pour une semaine gratuite si vous souhaitez obtenir plus d'informations.

493voto

Véger Lóránd Points 504

Il y a une nouvelle méthode qui est venue avec Angular 7.2.0

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

Envoyez :

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

Recevez :

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

Vous pouvez trouver des informations supplémentaires ici :

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

Le lien ci-dessus contient cet exemple qui peut être utile : https://stackblitz.com/edit/angular-bupuzn

40 votes

C'est la bonne réponse compte tenu des nouvelles fonctionnalités d'Angular 7.

4 votes

Avec cette approche, comment dois-je gérer un rafraîchissement du navigateur par l'utilisateur ? Dans ce cas, les données contenues dans les extras de navigation semblent disparaître, et il n'y a donc aucune chance de les réutiliser lors de l'actualisation.

1 votes

@tobi_b Je pense que vous avez raison, après un rafraîchissement vous ne pouvez pas l'atteindre. Si vous en avez besoin après le rafraîchissement, les méthodes de la réponse acceptée seront meilleures.

70voto

dev-nish Points 91

La dernière version d'angular (7.2 +) a maintenant l'option de passer des informations supplémentaires en utilisant NavigationExtras .

Composant de la maison

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

nouveauComposant

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

Sortie

enter image description here

J'espère que cela vous aidera !

6 votes

Je continue à obtenir "navigation is null". J'ai essayé plusieurs exemples...

14 votes

C'est vieux, mais pour les futurs visiteurs - vous ont pour l'appeler dans le constructeur. stackoverflow.com/a/54891361/2950032

0 votes

Pouvez-vous toujours accéder aux données d'état après un rafraîchissement de la page ?

6voto

Vous pouvez l'utiliser. Angular2+/4/5 - naviguer avec des données https://github.com/Hipparch/Angular2-navigate-with-data

1voto

Saurav Mohan V Points 9

@dev-nish Votre code fonctionne avec des petites modifications. faites le

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

en

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

ensuite, si vous voulez envoyer spécifiquement un type de données, par exemple, JSON à la suite du remplissage d'un formulaire, vous pouvez envoyer les données de la même manière que celle expliquée précédemment.

0 votes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X