Dans l'un des modèles de mes routes Angular 2 ( FirstComponent ), j'ai un bouton
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
Mon objectif est d'atteindre:
Cliquez sur le bouton -> route vers un autre composant tout en préservant les données et sans utiliser l'autre composant comme directive.
C'est ce que j'ai essayé ...
1ÈRE APPROCHE
Dans la même vue, je stocke la collecte des mêmes données en fonction de l'interaction de l'utilisateur.
first.component.ts
export class FirstComponent {
constructor(private _router: Router) { }
property1: number;
property2: string;
property3: TypeXY; // this a class, not a primitive type
// here some class methods set the properties above
// DOM events
routeWithData(){
// here route
}
}
Normalement, j'acheminais vers SecondComponent par
this._router.navigate(['SecondComponent']);
éventuellement passer les données par
this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);
considérant que la définition du lien avec les paramètres serait
@RouteConfig([
// ...
{ path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent}
)]
Le problème avec cette approche est que je suppose que je ne peux pas transmettre de données complexes (par exemple un objet comme property3) dans l'url;
2ÈME APPROCHE
Une alternative serait d'inclure SecondComponent comme directive dans FirstComponent.
<SecondComponent [p3]="property3"></SecondComponent>
Cependant, je veux router vers ce composant, ne pas l'inclure!
3ÈME APPROCHE
La solution la plus viable que je vois ici serait d'utiliser un service (par exemple FirstComponentService) pour
- stocker les données (_firstComponentService.storeData ()) sur routeWithData () dans FirstComponent
- récupérer les données (_firstComponentService.retrieveData ()) dans ngOnInit () dans SecondComponent
Bien que cette approche semble parfaitement viable, je me demande si c'est la façon la plus simple / la plus élégante d'atteindre l'objectif.
En général, je voudrais savoir si je manque d'autres approches potentielles pour transmettre les données entre les composants, en particulier avec le moins de code possible
la source
Pass data using Query Parameters
est ce que je cherchais. votre lien a sauvé ma journée.state
le PR pour plus de détails. Quelques informations utiles iciRéponses:
mise à jour 4.0.0
Voir la documentation angulaire pour plus de détails https://angular.io/guide/router#fetch-data-before-navigating
original
Utiliser un service est la voie à suivre. Dans les paramètres d'itinéraire, vous ne devez transmettre que les données que vous souhaitez refléter dans la barre d'URL du navigateur.
Voir également https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
Le routeur livré avec RC.4 réintroduit
data
Voir également le Plunker sur https://github.com/angular/angular/issues/9757#issuecomment-229847781
la source
ngOnInit() { this.myVar = this.route.snapshot.data['some_data']; }
NavigationExtras
- stackoverflow.com/a/54879389/1148107Je pense que nous n'avons pas le genre de chose $ rootScope en angulaire 2 comme en angulaire 1.x. Nous pouvons utiliser angulaire 2 service / classe partagé pendant que dans ngOnDestroy passer les données au service et après le routage prendre les données du service dans la fonction ngOnInit :
Ici, j'utilise DataService pour partager un objet héros:
Passer l'objet du composant de première page:
Prendre l'objet du composant de la deuxième page:
Voici un exemple: plunker
la source
this.hero = this.dataService.hero
? Vais-je obtenir les valeurs?eh bien la façon la plus simple de le faire dans angular 6 ou dans d'autres versions j'espère est de simplement définir votre chemin avec la quantité de données que vous voulez passer
comme vous pouvez le voir dans ma définition des itinéraires, j'ai ajouté le
/:id
support aux données que je souhaite transmettre au composant via la navigation du routeur. Par conséquent, votre code ressemblera àafin de lire le
id
sur le composant, il suffit d'importerActivatedRoute
commeet
ngOnInit
c'est là que vous récupérez les donnéesvous pouvez en lire plus dans cet article https://www.tektutorialshub.com/angular-passing-parameters-to-route/
la source
Angular 7.2.0 a introduit une nouvelle façon de transmettre les données lors de la navigation entre les composants routés:
Ou:
Pour lire l'état, vous pouvez accéder à la
window.history.state
propriété une fois la navigation terminée:la source
window.history.state
renvoie quelque chose comme{navigationId: 2}
au lieu de renvoyer l'objet que j'ai transmis.navigationId
une valeur est ajoutée. Si aucune donnée n'est ajoutée, seul lenavigationId
sera affiché. Consultez les données transmises, revenez en arrière ou actualisez votre application et relancez l'action qui ajoute les données à l'itinéraire et navigue vers l'itinéraire suivant (par exemple, un clic sur le bouton). Cela ajoutera ensuite vos données à l'objet.Une personne super intelligente (tmburnell) qui n'est pas moi suggère de réécrire les données de l'itinéraire:
Comme on le voit ici dans les commentaires.
J'espère que quelqu'un trouvera cela utile
la source
Je cette l'autre approche pas bon pour cette question. Je pense que la meilleure approche est Query-Parameter par
Router
angular qui a 2 voies:Avec ce code , vous pouvez naviguer
url
parparams
votre code html:Vous devez injecter le routeur dans votre
constructor
comme:Maintenant, utilisez cela comme:
Maintenant, si vous voulez lire
Router
dans un autre,Component
vous devez utiliserActivatedRoute
comme:et
subscribe
que:la source
Nous sommes en 2019 et de nombreuses réponses ici fonctionneraient, selon ce que vous voulez faire. Si vous voulez passer dans un état interne non visible dans l'URL (paramètres, requête), vous pouvez utiliser
state
depuis 7.2 (comme je l'ai appris aujourd'hui :)).Depuis le blog (crédits Tomasz Kula) - vous accédez à l'itinéraire ....
... de ts:
this.router.navigateByUrl('/details', { state: { hello: 'world' } });
... à partir du modèle HTML:
<a routerLink="/details" [state]="{ hello: 'world' }">Go</a>
Et pour le récupérer dans le composant cible:
Tard, mais j'espère que cela aide quelqu'un avec Angular récent.
la source
Solution avec ActiveRoute (si vous voulez passer objet par route - utilisez JSON.stringfy / JSON.parse):
Préparez l'objet avant de l'envoyer:
Recevez votre objet dans le composant destination:
la source
super.ngOnInit();
?La troisième approche est le moyen le plus courant de partager des données entre les composants. vous pouvez injecter le service d'élément que vous souhaitez utiliser dans le composant associé.
la source
Passer en utilisant JSON
la source
utiliser un service partagé pour stocker des données avec un index personnalisé. puis envoyez cet index personnalisé avec queryParam. cette approche est plus flexible .
.
la source
dis que tu as
et vous souhaitez transmettre des données à component2.ts .
dans component1.ts est une variable avec des données dites
la source
Vous pouvez utiliser BehaviorSubject pour partager des données entre les composants routés. Un BehaviorSubject contient une valeur. Lorsqu'il est souscrit, il émet la valeur immédiatement. Un sujet n'a pas de valeur.
Dans le service.
Dans le composant, vous pouvez vous abonner à ce BehaviorSubject.
Remarque: le sujet ne fonctionnera pas ici, vous devez utiliser uniquement le sujet de comportement.
la source