Je cherche à détecter un changement d'itinéraire dans mon AppComponent
.
Par la suite, je vérifierai le jeton utilisateur global pour voir s'il est connecté. Ensuite, je pourrai rediriger l'utilisateur s'il n'est pas connecté.
Dans Angular 2, vous pouvez subscribe
(événement Rx) vers une instance de routeur. Vous pouvez donc faire des choses comme
class MyClass {
constructor(private router: Router) {
router.subscribe((val) => /*whatever*/)
}
}
Modifier (depuis rc.1)
class MyClass {
constructor(private router: Router) {
router.changes.subscribe((val) => /*whatever*/)
}
}
Edit 2 (depuis 2.0.0)
voir aussi: doc Router.events
class MyClass {
constructor(private router: Router) {
router.events.subscribe((val) => {
// see also
console.log(val instanceof NavigationEnd)
});
}
}
event._root.children[0].value._routeConfig.data
espérant qu'il puisse y avoir une meilleure façonfilter
opérateur RxJS .router.events.pipe(filter(e => e instanceof NavigationEnd).subscribe((e) => { ... }
RxJS 6
Merci à Peilonrayz (voir les commentaires ci-dessous)
nouveau routeur> = RC.3
Vous pouvez également filtrer par l'événement donné:
L'utilisation de l'
pairwise
opérateur pour obtenir l'événement précédent et actuel est également une bonne idée. https://github.com/angular/angular/issues/11268#issuecomment-244601977la source
Argument of type '(event: Event) => void' is not assignable to parameter of type
Argument of type '(event: Event) => void' is not assignable to parameter of type
erreur est due au fait que dans votre extrait de filtre, vous vous abonnez à un objet de type Event au lieu de NavigationEvent.Pour Angular 7, quelqu'un devrait écrire comme:
this.router.events.subscribe((event: Event) => {})
Un exemple détaillé peut être le suivant:
la source
Angulaire 7 , si vous voulez
subscribe
larouter
la source
Angulaire 4.x et supérieur:
Ceci peut être réalisé en utilisant la propriété url de la classe ActivatedRoute comme ci-dessous,
Remarque: que vous devez importer et injecter le fournisseur à partir du
angular/router
packageet
la source
Le routeur 3.0.0-beta.2 devrait être
la source
En angulaire 6 et RxJS6:
la source
import {Router, NavigationEnd} from "@angular/router"
Les réponses ici sont correctes pour
router-deprecated
. Pour la dernière version derouter
:ou
Pour voir la différence entre les deux, veuillez consulter cette question SO .
Éditer
Pour les dernières, vous devez faire:
la source
router
a été mis à jour à nouveau (je n'ai pas encore mis à jour ma réponse), donc je ne sais pas comment c'est pour la dernière. Pour ce dontrouter
j'ai parlé, vous ne pouviez pas. @aknDans Angular 8, vous devriez faire comme
this.router.events.subscribe((event: Event) => {})
Exemple:
la source
Dans le composant, vous pouvez essayer ceci:
la source
la source
La localisation fonctionne ...
la source
au-dessus de la plupart des solutions correctes, mais je suis confronté à un problème qui émet plusieurs fois l'événement "Emission de navigation". Hear est donc la solution complète pour Angular 6.
la source
@Ludohen est une bonne réponse, mais au cas où vous ne voudriez pas utiliser,
instanceof
utilisez ce qui suitde cette façon, vous pouvez vérifier le nom de l'événement actuel sous forme de chaîne et si l'événement s'est produit, vous pouvez faire ce que vous avez prévu de faire votre fonction.
la source
Event
type provoque une erreur dans Atom c'est pourquoi je ne l'ai pas utiliséinstanceOf
pour que votre exemple fonctionne également dans le code de production.if(event instanceOf NavigationStart) {
if(event instanceof NavigationStart)
Je travaille avec l'application angular5 et je suis confronté au même problème. quand je passe par la documentation angulaire, ils fournissent la meilleure solution pour gérer les événements du routeur. Vérifiez la documentation suivante.
Événements de routeur dans Angular Route événements dans angular5
Mais spécifiquement pour le cas en question, nous avons besoin de NavigationEnd Event
Événement de fin de navigation angulaire
Comment l'utiliser?
Quand l'utiliser?
Dans mon cas, mon application partage un tableau de bord commun pour tous les utilisateurs tels que les utilisateurs, les administrateurs, mais j'ai besoin d'afficher et de masquer certaines options de barre de navigation selon les types d'utilisateurs.
C'est pourquoi chaque fois que l'url change, je dois appeler la méthode de service qui renvoie les informations utilisateur connectées conformément à la réponse, j'irai pour d'autres opérations.
la source
Les types d'œuvres suivants peuvent faire l'affaire pour vous.
Malheureusement, cela redirige plus tard dans le processus de routage que je ne le souhaiterais. Le
onActivate()
composant cible d'origine est appelé avant la redirection.Il y a un
@CanActivate
décorateur que vous pouvez utiliser sur le composant cible mais c'est a) non centralisé et b) ne bénéficie pas des services injectés.Ce serait formidable si quelqu'un pouvait suggérer une meilleure façon d'autoriser centralement un itinéraire avant qu'il ne soit validé. Je suis sûr qu'il doit y avoir un meilleur moyen.
Voici mon code actuel (comment pourrais-je le changer pour écouter le changement d'itinéraire?):
la source
Je le fais comme ça depuis RC 5
la source
Modifiez simplement AppRoutingModule comme
la source
Angulaire 8. Vérifiez si l'itinéraire actuel est l'itinéraire de base .
la source
J'écrirais quelque chose comme ceci:
la source
réponse simple pour Angular 8. *
la source