Envoyer des données via des chemins de routage dans Angular

182

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

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

car certaines données ne sont pas un paramètre valide. Comment puis je faire ça? Je ne veux pas envoyer le paramètre avec queryParams.

Motomine
la source
Je pense que ça devrait être autrement comme dans AngularJS, où nous avons pu faire quelque chose comme $ state.go ('heroes', {some-data: "otherData"})
Motomine
3 façons simples de partager des données via des itinéraires - angulartutorial.net/2017/12/…
Prashobh
Use my approach npmjs.com/package/ngx-navigation-with-data Dernier commentaire de moi, le meilleur pour tout le monde
Virendra Yadav

Réponses:

517

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

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:

entrez la description de l'image ici

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

entrez la description de l'image ici

3) Paramètres de requête d'itinéraire:

entrez la description de l'image ici

4) Vous pouvez utiliser un service pour transmettre des données d'un composant à un autre sans utiliser du tout les paramètres d'itinéraire.

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

J'ai un plunker de ceci ici: https://plnkr.co/edit/KT4JLmpcwGBM2xdZQeI9?p=preview

DeborahK
la source
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. Pouvez-vous me donner un exemple pour le 4)? Je ne sais pas comment faire.
Motomine
J'ai mis à jour par réponse pour afficher les différentes URL et pour fournir un lien vers un article de blog et un explorateur sur la façon de transmettre des données avec un service. L'URL est différente avec les paramètres facultatifs et de requête comme indiqué ci-dessus. De plus, les paramètres de requête peuvent être conservés sur les itinéraires.
DeborahK
6
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 êtes intéressé par plus d'informations.
DeborahK
3
Les données ne sont «partagées» qu'au sein de l'application en cours d'exécution. Si l'utilisateur actualise la page, l'application entière est rechargée à partir du serveur, de sorte qu'aucun état antérieur n'est conservé dans l'application. Penser à cela en termes d'application normale, lorsqu'un utilisateur actualise, c'est comme fermer et rouvrir l'application. Si vous devez conserver l'état après une actualisation, vous devrez le stocker quelque part, par exemple dans le stockage local ou sur le serveur.
DeborahK
2
Juste un petit indice: le routetype est ActivatedRoute, non Router.
Arsen Khachaturyan
156

Il existe une nouvelle méthode fournie avec Angular 7.2.0

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

Envoyer:

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

Recevoir:

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

Vous pouvez trouver quelques informations supplémentaires ici:

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

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

Véger Lóránd
la source
11
C'est la bonne réponse compte tenu des nouvelles fonctionnalités d'Angular 7.
Randy
2
Avec cette approche, comment gérerais-je une actualisation du navigateur par l'utilisateur? Dans ce cas, les données des extras de navigation semblent disparaître, il n'y a donc aucune chance de les utiliser à nouveau lors de l'actualisation.
tobi_b
1
@tobi_b Je pense que vous avez raison, après le rafraîchissement, vous ne pouvez pas y accéder. Si vous en avez besoin après l'actualisation, les méthodes de la réponse acceptée seront meilleures.
Véger Lóránd
3
Oui, c'est pourquoi vous ne pouvez obtenir les données qu'à partir de this.router.getCurrentNavigation () dans le constructeur. Si vous en avez besoin ailleurs, comme dans ngOnInit (), vous pouvez accéder au creux de données "history.state". De la documentation: "État transmis à n'importe quelle navigation. Cette valeur sera accessible via l'objet extras renvoyé par router.getCurrentNavigation () pendant qu'une navigation est en cours d'exécution. Une fois la navigation terminée, cette valeur sera écrite dans history.state lorsque l'emplacement La méthode .go ou location.replaceState est appelée avant l'activation de cette route. "
Véger Lóránd
8
Assurez-vous également de ne pas essayer de recevoir un objet supplémentaire dans ngOnInit()asthis.router.getCurrentNavigation().extras
hastrb
26

La dernière version d'angular (7.2 +) a maintenant la possibilité de transmettre des informations supplémentaires à l'aide de NavigationExtras .

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

Production

entrez la description de l'image ici

J'espère que cela aiderait!

dev-nish
la source
1

@ dev-nish Votre code fonctionne avec de petites modifications. faire le

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

dans

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

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

Saurav Mohan V
la source
0

Dans navigateExtra, nous ne pouvons passer qu'un certain nom spécifique en argument, sinon il affiche une erreur comme ci-dessous: Pour Ex- Ici, je veux passer la clé client dans le routeur de navigation et je passe comme ceci-

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

mais il montre une erreur comme ci-dessous:

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'

.

Solution: nous devons écrire comme ceci:

this.Router.navigate(['componentname'],{state: {customerkey:response.key}});
A. PRABIN SARAB
la source
-2

Le mieux que j'ai trouvé sur Internet pour cela est ngx-navigation-with-data . C'est très simple et bon pour la navigation des données d'un composant à un autre composant. Vous devez simplement importer la classe de composant et l'utiliser de manière très simple. Supposons que vous ayez la maison et à propos du composant et que vous souhaitiez envoyer des données

COMPOSANT DE LA MAISON

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

}

À PROPOS DE COMPOSANT

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

}

Pour toute requête, suivez https://www.npmjs.com/package/ngx-navigation-with-data

Commentez pour obtenir de l'aide.

Virendra Yadav
la source
Transfère-t-il des données sous forme de paramètres ou simplement en arrière-plan?
Marium Malik
Je n'ai pas compris @MariumMalik Pouvez-vous s'il vous plaît demander de manière descriptive?
Virendra Yadav
Oui, il le fait @MariumMalik
Virendra Yadav
3
Vous semblez en être l'auteur, plutôt que "J'ai trouvé sur Internet"? Il vous est également demandé de ne pas le spammer sur le fil Angular 7 qui implémente des fonctionnalités similaires ( github.com/angular/angular/pull/27198 )
IrishDubGuy