Angulaire 2: prise en RouteParams du composant parent
Comment puis-je obtenir le RouteParams d'un composant parent?
App.ts
:
@Component({
...
})
@RouteConfig([
{path: '/', component: HomeComponent, as: 'Home'},
{path: '/:username/...', component: ParentComponent, as: 'Parent'}
])
export class HomeComponent {
...
}
Et puis, dans le ParentComponent
, je peux facilement obtenir mon nom d'utilisateur paramètre et la valeur de l'enfant routes.
Parent.ts
:
@Component({
...
})
@RouteConfig([
{ path: '/child-1', component: ChildOneComponent, as: 'ChildOne' },
{ path: '/child-2', component: ChildTwoComponent, as: 'ChildTwo' }
])
export class ParentComponent {
public username: string;
constructor(
public params: RouteParams
) {
this.username = params.get('username');
}
...
}
Mais alors, comment puis-je obtenir ce même "nom d'utilisateur" paramètre dans les composants enfants? Faire la même chose que ci-dessus, ne pas le faire. Parce que ces paramètres sont définis à l'ProfileComponent ou quelque chose??
@Component({
...
})
export class ChildOneComponent {
public username: string;
constructor(
public params: RouteParams
) {
this.username = params.get('username');
//returns null
}
...
}
Comment sur une entrée de la propriété sur les enfants? E. g., dans le template parent:
Serait-ce également le travail sur
Je pense que vous êtes à vous demander si quelque chose comme
Je suis désolé @MarkRajcok , j'ai tapé mal.. je voulais dire
Il y a peut être des informations utiles github.com/angular/angular/issues/6204#issuecomment-173273143
<child-one-component [username]="username"> ...
Serait-ce également le travail sur
<routerlink [username]="username">...
? Et est-ce que le chemin à parcourir alors @MarkRajcok?Je pense que vous êtes à vous demander si quelque chose comme
<a [router-link]="[ './....', {username: username} ]
fonctionne. Désolé, je n'ai aucune idée si cela va fonctionner ou pas. (Je n'ai pas joué avec beaucoup de routage).Je suis désolé @MarkRajcok , j'ai tapé mal.. je voulais dire
<router-outlet></router-outlet>
, dois-je mettre des commentaires sur cette. Parce que l'enfant routes wil rendu là..Il y a peut être des informations utiles github.com/angular/angular/issues/6204#issuecomment-173273143
OriginalL'auteur Aico Klein Ovink | 2015-12-28
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR:
Maintenant que Angular2 final a été publié officiellement, la bonne façon de le faire est le suivant:
ORIGINAL:
Voici comment je l'ai fait à l'aide de la "@angulaire/routeur": "3.0.0-alpha.6" package:
Dans cet exemple, la route a le format suivant: /parent/:id/enfant/:childid
Il y a une autre façon depuis Angulaire 5.2 qui ne vous obligent pas à parcourir
parent
1 fois. Voir stackoverflow.com/a/48511516/4185989 Toujours intéressant de considérer l'subscribe
/unsubscribe
modèle à partir de cette réponse.Dans Angulaire 6
this.activatedRoute.parent.snapshot.params.someParam
Solution pointé par @jmq est le meilleur angulaire 6 ainsi, nous n'avons pas besoin de souscrire séparément pour le parent de l'id.
OriginalL'auteur Fábio Junqueira
Vous ne devriez pas essayer d'utiliser
RouteParams
dans votreChildOneComponent
.Utilisation
RouteRegistry
, la place!Mise à JOUR: à partir de ce pull request (angulaire de la bêta.9): https://github.com/angular/angular/pull/7163
Vous pouvez maintenant avoir accès à l'instruction sans
recognize(location.path(), [])
.Exemple:
Je n'ai pas essayé, mais
Plus de détails ici:
https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta9-2016-03-09
https://angular.io/docs/ts/latest/api/router/Router-class.html
Mise à JOUR 2:
Un petit changement angulaire de la version 2.0.0.beta15:
Maintenant
currentInstruction
n'est pas une fonction plus. En outre, vous devez charger laroot
routeur. (merci à @Lxrd-AJ pour le reporting)J'ai mis à jour ma réponse. À partir de angulaire de la bêta.9 vous pouvez obtenir l'instruction en cours directement à partir du Routeur de la composante.
Merci pour la mise à jour. Je suis sur le point de la mise à niveau de la version bêta.6 à la bêta.13 donc, je vais l'essayer, après je fais.
Une légère modification de cette réponse, l'Utilisation
_router.root.currentInstruction.component.params['id']
. L'accent sur racine comme vous pouvez maintenant obtenir la currentInstruction à partir de la racine du routeur et pas_router
. PS: je suis en utilisantangular2.0.0-beta.15
_router.racine n'existe plus. (J'utilise Angulaire 2.4.7)
OriginalL'auteur ProGM
Comme mentionné par Günter Zöchbauer, j'ai utilisé le commentaire à https://github.com/angular/angular/issues/6204#issuecomment-173273143 à l'adresse de mon problème. J'ai utilisé le
Injector
classe deangular2/core
pour aller chercher de l'routeparams de la société mère. S'avère angulaire 2 ne gère pas profondément imbriqués les routes. Peut-être qu'ils vont ajouter que, dans l'avenir.OriginalL'auteur Lordking
Je l'ai trouvé moche mais la solution de travail, en demandant à la mère (précisément le 2ème ancêtre) de l'injecteur, et par l'obtention de l'
RouteParams
à partir d'ici.Quelque chose comme
Semble que .le parent a été enlevé sur la RC3
OriginalL'auteur Yohan G.
RC5 + @angulaire/routeur": "3.0.0-rc.1 SOLUTION: Il semble que
this.router.routerState.queryParams
a été désapprouvée. Vous pouvez obtenir le parent paramètre de route de cette façon:OriginalL'auteur Stephen Paul
Vous pouvez prendre composant de parent de l'itinéraire à l'intérieur du composant enfant à partir de l'injecteur et puis obtenir tout de composant enfant. Dans votre cas, comme ce
OriginalL'auteur Danxil
Passage de l'Injecteur exemple de constructeur en composant enfant ne peut pas être bon si vous voulez écrire des tests unitaires pour votre code.
La façon la plus simple de contourner cela est d'avoir un service de classe du composant parent, dans lequel vous enregistrez vos paramètres.
Ensuite, vous avez juste injecter le même service à des composants enfants et l'accès à la params.
Notez que vous devez portée d'un tel service pour votre composant parent et son enfant composants à l'aide de "fournisseurs" dans le composant parent décorateur.
Je recommande cet article à propos de DI et de la portée Angulaire 2: http://blog.thoughtram.io/angular/2015/08/20/host-and-visibility-in-angular-2-dependency-injection.html
OriginalL'auteur qdb
Dans RC6, routeur 3.0.0-rc.2 (fonctionne probablement en RC5), vous pouvez prendre la route params à partir de l'URL d'un instantané dans le cas où les paramètres ne changent pas, sans observables avec cette seule ligne:
this.route.snapshot.parent.params['username'];
N'oubliez pas d'injecter ActivatedRoute comme suit:
constructor(private route: ActivatedRoute) {};
OriginalL'auteur mrgoos
Avec RxJS de
Observable.combineLatest
, nous pouvons obtenir quelque chose de proche de la idiomatiques params manipulation:OriginalL'auteur In-Ho Yi
J'ai fini par écrire ce genre de hack Angulaire 2 rc.1
Maintenant en vue, je collecte les paramètres en vue au lieu de lire
RouteParams
je viens de les obtenir par le biais de routeur:MergedRouteParams
classe qui implémente l'get
méthode de la normeRouteParams
classe (deuxième paramètre est l'indice, les valeurs par défaut à zéro).OriginalL'auteur Mikael Lepistö
Dans FINAL avec un peu d'aide de RXJS vous pouvez combiner les deux cartes (de l'enfant et parent):
D'autres questions que l'on peut avoir:
OriginalL'auteur wendro
Vous pouvez le faire sur le cliché avec le suivant, mais si elle change, votre
id
la propriété ne seront pas mis à jour.Cet exemple montre également comment vous pouvez vous abonner à tous ancêtre des changements de paramètres et de regarder pour la personne que vous êtes intéressé par la fusion de tous les paramètre observables. Cependant, soyez prudent avec cette méthode, car il pourrait y avoir plusieurs ancêtres qui ont le même paramètre clé/nom.
OriginalL'auteur shattar