Comment recharger l'itinéraire actuel avec le routeur angular 2


141

J'utilise angular 2 avec une stratégie de hashlocation.

Le composant est chargé avec cette route:

"departments/:id/employees"

Jusqu'ici très bien.

Après avoir effectué une sauvegarde par lots réussie de plusieurs lignes de table modifiées, je veux recharger l'url de la route actuelle via:

this.router.navigate([`departments/${this.id}/employees`]);

Mais rien ne se passe, pourquoi?


Jetez un oeil à cette réponse à une question similaire: stackoverflow.com/a/44580036/550975
Serj Sagan

Réponses:


47

Si votre navigateur () ne modifie pas l'URL déjà affichée dans la barre d'adresse de votre navigateur, le routeur n'a rien à faire. Ce n'est pas le travail du routeur de rafraîchir les données. Si vous souhaitez actualiser les données, créez un service injecté dans le composant et appelez la fonction de chargement sur le service. Si les nouvelles données seront récupérées, cela mettra à jour la vue via des liaisons.


2
Maintenant, vous le dites, je dois être d'accord MAIS ... le routeur angularjs ui avait une option de rechargement, rechargeant ainsi une route est opiniâtre ;-) Mais oui, je pourrais juste faire un rechargement des données thx pour cette astuce qui est en fait évidente ...
Pascal

83
Je ne suis pas d'accord: que faire si vous voulez relancer les gardes, par exemple si quelqu'un se déconnecte?
Jackie

1
@Jackie Je pensais que vous pourriez peut-être simplement relancer les gardes ... s'ils ont des redirections intégrées, alors cela pourrait faire l'affaire.
OldTimeGuitarGuy

11
@YakovFain désolé, mais c'est faux. Cela signifie que vous avez maintenant deux sources de vérité pour le comportement de la route - l'une se produit pendant la garde, l'autre se produit dans le composant. Non seulement vous dupliquez potentiellement la logique, mais vous vous heurtez à un flux de données plus naturel: 1. apportez des modifications à l'API, 2. actualisez l'itinéraire pour récupérer le nouvel état des données de l'API, faisant de l'API la source de vérité. Il n'y a tout simplement aucune raison de NE PAS donner aux utilisateurs la possibilité de redéclencher manuellement une route afin que le flux naturel de données puisse se reproduire.
AgmLauncher

4
Je ne pense pas que ce soit une bonne réponse. Le routeur doit être la source de vérité de vos données. Si vous devez le recharger via un service séparé, le routeur ne connaît plus la dernière version et vos composants ne peuvent plus compter sur votre routeur comme source de vérité.
Dan King

125

Cela peut maintenant être fait dans Angular 5.1 en utilisant le onSameUrlNavigation propriété de la configuration du routeur.

J'ai ajouté un blog expliquant comment ici, mais l'essentiel est le suivant

https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2

Dans l' onSameUrlNavigationoption d' activation de la configuration de votre routeur , définissez-la sur 'reload'. Cela amène le routeur à déclencher un cycle d'événements lorsque vous essayez de naviguer vers une route déjà active.

@ngModule({
 imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})],
 exports: [RouterModule],
 })

Dans vos définitions d'itinéraire, définissez runGuardsAndResolverssur always. Cela indiquera au routeur de toujours lancer les cycles de gardes et de résolveurs, déclenchant les événements associés.

export const routes: Routes = [
 {
   path: 'invites',
   component: InviteComponent,
   children: [
     {
       path: '',
       loadChildren: './pages/invites/invites.module#InvitesModule',
     },
   ],
   canActivate: [AuthenticationGuard],
   runGuardsAndResolvers: 'always',
 }
]

Enfin, dans chaque composant dont vous souhaitez activer le rechargement, vous devez gérer les événements. Cela peut être fait en important le routeur, en se liant aux événements et en invoquant une méthode d'initialisation qui réinitialise l'état de votre composant et récupère les données si nécessaire.

export class InviteComponent implements OnInit, OnDestroy {
 navigationSubscription;     

 constructor(
   // … your declarations here
   private router: Router,
 ) {
   // subscribe to the router events. Store the subscription so we can
   // unsubscribe later.
   this.navigationSubscription = this.router.events.subscribe((e: any) => {
     // If it is a NavigationEnd event re-initalise the component
     if (e instanceof NavigationEnd) {
       this.initialiseInvites();
     }
   });
 }

 initialiseInvites() {
   // Set default values and re-fetch any data you need.
 }

 ngOnDestroy() {
   if (this.navigationSubscription) {
     this.navigationSubscription.unsubscribe();
   }
 }
}

Avec toutes ces étapes en place, vous devriez avoir activé le rechargement d'itinéraire.


Existe-t-il un moyen de recharger le composant au lieu d'appeler une initfonction,
Ebraheem Alrabeea

Je ne pense pas ... à moins que vous ne quittiez la route et que vous reveniez. Une fonction init n'est pas la fin du monde, vous pouvez contrôler l'initialisation au point qu'elle a le même effet que le rechargement du composant. Y a-t-il une raison particulière pour laquelle vous souhaitez effectuer un rechargement complet sans init?
Simon McClive

J'ai trouvé une solution à mon problème, merci pour votre réponse et le blog c'était utile.
Ebraheem Alrabeea

Comment le faire dans Angular 4 autre que le rechargement de la fenêtre.
Vishakha le

Fonctionne très bien pour mon application Angular5! Se désabonner dans ngOnDestroy () est un peu important - intéressant quand vous ne le faites pas :-)
BobC

107

Créez une fonction dans le contrôleur qui redirige vers la route attendue comme ceci

redirectTo(uri:string){
   this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
   this.router.navigate([uri]));
}

puis utilise-le comme ça

this.redirectTo('//place your uri here');

cette fonction redirigera vers une route factice et retournera rapidement à la route de destination sans que l'utilisateur s'en rende compte.


3
Merci! La meilleure solution ici.
Alan Smith

Cette solution fonctionne bien, nous pouvons l'utiliser jusqu'à ce que nous en obtenions une meilleure. Merci @theo.
Sibeesh Venu

12
cela fonctionne comme un charme quand je l'ai utilisé à la '/'place de'/DummyComponent'
suhailvs

1
Fonctionne très bien dans Angular 7, sans problèmes dans l'historique du navigateur. J'ai choisi d'utiliser cette solution car je visais un composant spécifique. Il me semble que le rechargement de la même page est généralement un cas anormal, donc faire en sorte que toute l'application suive un paradigme spécifique semble exagéré. C'est petit et plus facile à mettre en œuvre que d'autres solutions.
JE Carter II

1
D'accord, cela fonctionne mais ... il rechargera votre HomeComponent (ou tout ce que vous avez sur la route "/"), passera par le cycle de vie complet de ngOnInit / ngOnDestroy pour rien. Mieux vaut avoir un itinéraire spécifique avec un composant factice et léger ou vous remarquerez le décalage
pétrone le

77

ÉDITER

Pour les nouvelles versions d'Angular (5.1+), utilisez la réponse suggérée par @Simon McClive

Ancienne réponse

J'ai trouvé cette solution de contournement sur une demande de fonctionnalité GitHub pour Angular:

this._router.routeReuseStrategy.shouldReuseRoute = function(){
    return false;
};

this._router.events.subscribe((evt) => {
    if (evt instanceof NavigationEnd) {
        this._router.navigated = false;
        window.scrollTo(0, 0);
    }
});

J'ai essayé d'ajouter cela à ma fonction app.component.ts ngOnInit , et cela a bien fonctionné. Tous les autres clics sur le même lien rechargent maintenant lecomponent données et.

Lien vers la demande de fonctionnalité GitHub d'origine

Le crédit revient à mihaicux2 sur GitHub.

J'ai testé ceci sur la version 4.0.0-rc.3avecimport { Router, NavigationEnd } from '@angular/router';


1
Je viens d'essayer ceci dans Angular 4.4.x et cela fonctionne complètement. Merci!
Équipe Mindsect

1
Cela fonctionnait très bien pour moi, jusqu'à ce que j'implémente la barre d'onglets de navigation de Material pour naviguer dans les itinéraires enfants de chaque itinéraire parent dans mon application. Une fois que l'utilisateur atteint la page qui exécute ce code, la barre d'encre animée disparaît. (Pourquoi? Je n'ai pas assez de temps ou d'espace pour expliquer ...)
andreisrob

3
C'est une très mauvaise idée - votre ActivatedRoute sera désormais toujours la même.
artuska

1
@AnandTyagi Essayez la solution SimonMcClives si vous utilisez Angular 5.1+. Peut-être que cela fonctionne mieux pour vous.
Arg0n

2
Très mauvaise idée ... Car une fois qu'il a appliqué routeReuseStrategy.shouldReuseRoute = false, alors il chargera tous les composants de la hiérarchie des composants. Cela signifie donc que chaque composant parent et enfant commence à se recharger à tout changement d'URL. Il n'y a donc aucun sens à utiliser ce cadre.
PSabuwala

27

Peu compliqué: utilisez le même chemin avec des paramètres factices. Par exemple-

refresh(){
  this.router.navigate(["/same/route/path?refresh=1"]);
}

12
Maintenant: this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });et route.queryParams.subscribe(val => myRefreshMethod())route: ActivatedRouteest injecté dans le composant rafraîchi ... J'espère que ça aide
insan-e

4
Actuellement, dans Angular 7, cela ne semble plus fonctionner. Quelqu'un peut-il confirmer ou est-ce que je fais quelque chose de mal? (J'ai aussi essayé la légère variation de insan-e.)
pbarranis

2
Un peu moche peut-être.
Dabbbb.

19

J'utilise celui-ci pour le projet Angular 9:

reloadCurrentRoute() {
    let currentUrl = this.router.url;
    this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {
        this.router.navigate([currentUrl]);
    });
}

PS: testé et fonctionne également sur "Angular 7, 8"


J'ai pensé que je ferais part de mon expérience avec cette solution. Pour moi, il semble recharger l'ensemble du composant associé à l'itinéraire. Dans ma situation, un router.navigate régulier avec différents paramètres de routage gardera le composant chargé et chargera simplement les nouveaux changements de ngOnInit (basés sur les paramètres de route). Votre solution ne semble pas faire cela, elle semble en fait recharger tout le composant, puis apporter ses modifications dans le ngOnInit en fonction des paramètres d'itinéraire. Quoi qu'il en soit, c'est un inconvénient mineur pour moi dans ma situation et votre solution fonctionne pour mes besoins.
Evan Sevy le

Merci. fonctionne parfaitement.
Santosh

17

Piratage de rechargement de routes angulaires 2-4

Pour moi, utiliser cette méthode à l'intérieur d'un composant racine (composant, qui est présent sur n'importe quelle route) fonctionne:

onRefresh() {
  this.router.routeReuseStrategy.shouldReuseRoute = function(){return false;};

  let currentUrl = this.router.url + '?';

  this.router.navigateByUrl(currentUrl)
    .then(() => {
      this.router.navigated = false;
      this.router.navigate([this.router.url]);
    });
  }

Soyez prudent avec cette approche, cela affectera globalement le comportement du routeur (la route parent se rechargera toujours lors de la navigation entre les routes enfants).
seidme le

16

Cela fonctionne pour moi comme un charme

this.router.navigateByUrl('/', {skipLocationChange: true}).then(()=>
this.router.navigate([<route>]));

3
C'est la réponse la plus simple. Je marquerais ceci comme la réponse acceptée si je le pouvais. Contrairement à la réponse acceptée, il peut y avoir des situations où vous devez recharger chaque composant utilisé sur une page et devoir recharger individuellement chacun d'eux, qui peuvent être sur des itinéraires différents, serait exagéré même via un service.
Andrew Junior Howard

8

Sur la page de rechargement de changement de paramètre ne se produira pas. C'est vraiment une bonne fonctionnalité. Il n'est pas nécessaire de recharger la page mais nous devons changer la valeur du composant. La méthode paramChange appellera lors du changement d'URL. Nous pouvons donc mettre à jour les données des composants

/product/: id / details

import { ActivatedRoute, Params, Router } from ‘@angular/router’;

export class ProductDetailsComponent implements OnInit {

constructor(private route: ActivatedRoute, private router: Router) {
    this.route.params.subscribe(params => {
        this.paramsChange(params.id);
    });
}

// Call this method on page change

ngOnInit() {

}

// Call this method on change of the param
paramsChange(id) {

}

8

C'est ce que j'ai fait avec Angular 9 . Je ne suis pas sûr que cela fonctionne dans les anciennes versions.

Vous devrez l'appeler lorsque vous aurez besoin de recharger.

 this.router.navigate([], {
    skipLocationChange: true,
    queryParamsHandling: 'merge' //== if you need to keep queryParams
  })

Le routeur forRoot doit avoir SameUrlNavigation défini sur `` recharger ''

 RouterModule.forRoot(appRoutes, {
  // ..
  onSameUrlNavigation: 'reload',
  // ..
})

Et chaque itinéraire doit avoir runGuardsAndResolvers défini sur `` toujours ''

{
    path: '',
    data: {},
    runGuardsAndResolvers: 'always'
},

1
C'est la bonne réponse. "onSameUrlNavigation" fonctionne depuis Angular 5. Veuillez voter pour le déplacer vers le haut
Yaroslav Yakovlev

Cela n'a pas fonctionné pour moi. Andris ci-dessous l'a fait. Bien que le rechargement d'Andris ne soit pas aussi `` propre '' qu'une véritable navigation régulière. Il ne semble pas recharger la page entière, mais il semble recharger l'ensemble du composant associé à l'itinéraire. J'avais juste besoin de composants enfants à recharger en fonction des paramètres de l'itinéraire, pas du composant entier associé à l'itinéraire. Quoi qu'il en soit, cela fonctionne assez bien. Je pensais juste que je parlerais de mon expérience.
Evan Sevy le

4

Pour moi travaille en dur avec

this.router.routeReuseStrategy.shouldReuseRoute = function() {
    return false;
    // or
    return true;
};

1
Non recommandé! Les gens continuent de publier cette solution de différentes manières tout au long de cette SO. Oui, cela peut résoudre votre problème immédiat, mais vous oublierez plus tard que vous l'avez implémenté et vous passerez des heures à essayer de découvrir pourquoi votre application connaît un comportement étrange.
Helzgate le

Si vous devez utiliser cette solution, utilisez la solution Ebraheem Alrabee et ne l'appliquez qu'à un seul itinéraire.
Helzgate le

4

Pour autant que je sache, cela ne peut pas être fait avec le routeur dans Angular 2. Mais vous pouvez simplement faire:

window.location.href = window.location.href

Pour recharger la vue.


3
Cela actualise l'ensemble de l'application, pas seulement l'itinéraire actuel!
rostamiani

@HelloWorld - Où mettre ainsi la logique en angular 7?
Pra_A

Peu importe la version angulaire - ce n'est que du code js normal
HelloWorld

Mettez ceci sur la fonction de clic. window.location.href = '/' ou '/ login' qui est toujours défini dans app-routing.module.ts. Dans mon cas, lorsque l'utilisateur se déconnecte, il doit revenir à l'écran de connexion.Ainsi, lors de la déconnexion, j'efface toutes les données d'authentification et en cas de succès, utilisez window.location.href = '/'. Cela signifie recharger la page loagin et réexécuter à nouveau tous les javascript. Pour un changement d'itinéraire normal, je ne le recommanderai pas là où aucune réexécution des fonctions n'est requise.
Ali Exalter le

Je pense que cela peut complètement réinitialiser votre magasin NgRx - donc toutes les données que vous avez déjà récupérées seront perdues.
John Q

3

Nous avons trouvé une solution rapide et simple qui ne nécessite pas de bricoler le fonctionnement interne de angular:

En gros: créez simplement un itinéraire alternatif avec le même module de destination et basculez simplement entre eux:

const routes: Routes = [
  {
    path: 'gesuch',
    loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
  },
  {
    path: 'gesuch-neu',
    loadChildren: './sections/gesuch/gesuch.module#GesuchModule'
  }
];

Et voici le menu à bascule:

<ul class="navigation">
    <li routerLink="/gesuch-neu" *ngIf="'gesuch' === getSection()">Gesuch</li>
    <li routerLink="/gesuch" *ngIf="'gesuch' !== getSection()">Gesuch</li>
</ul>

J'espère que ça aide :)


Que faire si l'itinéraire alternatif a un paramètre et que vous souhaitez le recharger lorsque le paramètre change?
Mukus

3

Un peu hardcore mais

this.router.onSameUrlNavigation = 'reload';
this.router.navigateByUrl(this.router.url).then(() => {

    this.router.onSameUrlNavigation = 'ignore';

});

2

Dans mon cas:

const navigationExtras: NavigationExtras = {
    queryParams: { 'param': val }
};

this.router.navigate([], navigationExtras);

fonctionne correctement


2

implémenter OnInit et appeler ngOnInit () dans la méthode pour route.navigate ()

Voir un exemple:

export class Component implements OnInit {

  constructor() {   }

  refresh() {
    this.router.navigate(['same-route-here']);
    this.ngOnInit();   }

  ngOnInit () {

  }

2

Résolution d'un scénario similaire en utilisant un composant factice et une route pour reload, ce qui fait en fait un redirect. Cela ne couvre certainement pas tous les scénarios utilisateur, mais a simplement fonctionné pour mon scénario.

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Http } from '@angular/http';

@Component({
  selector: 'reload',
  template: `
    <h1>Reloading...</h1>
  `,
})
export class ReloadComponent implements OnInit{
  constructor(private router: Router, private route: ActivatedRoute) {
  }

  ngOnInit() {
    const url = this.route.snapshot.pathFromRoot.pop().url.map(u => u.path).join('/');
    this.router.navigateByUrl(url);
  }
}

Le routage est câblé pour attraper toutes les URL à l'aide d'un caractère générique:

import { RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { LoginViewComponent } from './views/login/login.component';
import { HomeViewComponent } from './views/home/home.component';
import { ReloadComponent } from './views/reload/reload.component';

@NgModule({
  declarations: [ 
    LoginViewComponent, HomeViewComponent, ReloadComponent
  ],
  imports: [
    RouterModule.forRoot([
      { path: 'login', component: LoginViewComponent },
      { path: 'home', component: HomeViewComponent },
      { 
        path: 'reload',
        children: [{
          path: '**',
          component: ReloadComponent 
        }]
      },
      { path: '**', redirectTo: 'login'}
    ])
  ],
  exports: [
    RouterModule,
  ],
  providers: [],

})
export class AppRoutingModule {}

Pour l'utiliser, il suffit d'ajouter recharger l'url où nous voulons aller:

  this.router.navigateByUrl('reload/some/route/again/fresh', {skipLocationChange: true})

2

Il existe différentes approches pour actualiser l'itinéraire actuel

Changer le comportement du routeur (depuis Angular 5.1) Réglez les routeurs onSameUrlNavigation sur «recharger». Cela émettra les événements du routeur sur la même navigation URL.

  • Vous pouvez ensuite les gérer en vous abonnant à un itinéraire
  • Vous pouvez l'utiliser avec la combinaison de runGuardsAndResolvers pour réexécuter les résolveurs

Laissez le routeur intact

  • Transmettez une actualisation queryParam avec l'horodatage actuel dans l'URL et abonnez-vous à queryParams dans votre composant acheminé.
  • Utilisez l'événement activate de la sortie du routeur pour mettre la main sur le composant acheminé.

J'ai écrit une explication plus détaillée sous https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e

J'espère que cela t'aides.


1

Supposons que la route du composant que vous souhaitez actualiser est view, puis utilisez ceci:

this.router.routeReuseStrategy.shouldReuseRoute = function (future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot) {
  if (future.url.toString() === 'view' && curr.url.toString() === future.url.toString()) {
    return false;
  }
  return (future.routeConfig === curr.routeConfig);
}; 

vous pouvez ajouter un debuggerà l'intérieur de la méthode pour savoir quel est l'itinéraire exact qui suivra après la navigation "departments/:id/employees".


1

Une solution est de passer un paramètre fictif (c'est-à-dire le temps en secondes), de cette façon le lien est toujours rechargé:

this.router.navigate(["/url", {myRealData: RealData, dummyData: (new Date).getTime()}])

1

J'utilise setTimeoutetnavigationByUrl pour résoudre ce problème ... Et cela fonctionne très bien pour moi.

Il est redirigé vers une autre URL et revient à la place dans l'URL actuelle ...

 setTimeout(() => {
     this.router.navigateByUrl('/dashboard', {skipLocationChange: false}).then(() =>
           this.router.navigate([route]));
     }, 500)

1

Je crois que cela a été résolu (nativement) dans Angular 6+; vérifier

Mais cela fonctionne pour un itinéraire complet (comprend également tous les itinéraires pour enfants)

Si vous souhaitez cibler un seul composant, procédez comme suit: Utilisez un paramètre de requête qui change, afin de pouvoir naviguer autant de fois que vous le souhaitez.

Au point de navigation (classe)

   this.router.navigate(['/route'], {
        queryParams: { 'refresh': Date.now() }
    });

Dans le composant que vous souhaitez "actualiser / recharger"

// . . . Component Class Body

  $_route$: Subscription;
  constructor (private _route: ActivatedRoute) {}

  ngOnInit() {
    this.$_route$ = this._route.queryParams.subscribe(params => {
      if (params['refresh']) {
         // Do Something
         // Could be calling this.ngOnInit() PS: I Strongly advise against this
      }

    });
  }

  ngOnDestroy() {
    // Always unsubscribe to prevent memory leak and unexpected behavior
    this.$_route$.unsubscribe();
  }

// . . . End of Component Class Body

1

Très frustrant qu'Angular ne semble toujours pas inclure une bonne solution pour cela. J'ai soulevé un problème github ici: https://github.com/angular/angular/issues/31843

En attendant, c'est ma solution de contournement. Il s'appuie sur certaines des autres solutions suggérées ci-dessus, mais je pense que c'est un peu plus robuste. Il s'agit d'encapsuler le service Routeur dans un " ReloadRouter", qui prend en charge la fonctionnalité de rechargement et ajoute également unRELOAD_PLACEHOLDER à la configuration principale du routeur. Ceci est utilisé pour la navigation intermédiaire et évite de déclencher d'autres routes (ou gardes).

Remarque: utilisez uniquement le ReloadRouterdans ces cas où vous souhaitez la fonctionnalité de rechargement. Utilisez la normale Routerautrement.

import { Injectable } from '@angular/core';
import { NavigationExtras, Router } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class ReloadRouter {
  constructor(public readonly router: Router) {
    router.config.unshift({ path: 'RELOAD_PLACEHOLDER' });
  }

  public navigate(commands: any[], extras?: NavigationExtras): Promise<boolean> {
    return this.router
      .navigateByUrl('/RELOAD_PLACEHOLDER', {skipLocationChange: true})
      .then(() => this.router.navigate(commands, extras));
  }
}

1

Importer Routeret ActivatedRoutedepuis@angular/router

import { ActivatedRoute, Router } from '@angular/router';

Injectez Routeret ActivatedRoute(au cas où vous auriez besoin de quelque chose de l'URL)

constructor(
    private router: Router,
    private route: ActivatedRoute,
) {}

Obtenez n'importe quel paramètre si nécessaire à partir de l'URL.

const appointmentId = this.route.snapshot.paramMap.get('appointmentIdentifier');

Utiliser une astuce en naviguant vers une URL factice ou principale puis vers l'URL réelle actualisera le composant.

this.router.navigateByUrl('/appointments', { skipLocationChange: true }).then(() => {
    this.router.navigate([`appointment/${appointmentId}`])
});

Dans ton cas

const id= this.route.snapshot.paramMap.get('id');
this.router.navigateByUrl('/departments', { skipLocationChange: true }).then(() => {
    this.router.navigate([`departments/${id}/employees`]);
});

Si vous utilisez une route factice, vous verrez un titre clignotant «Not Found» si vous avez implémenté une URL non trouvée au cas où ne correspondrait à aucune URL.


0

s'abonner aux modifications des paramètres d'itinéraire

    // parent param listener ie: "/:id"
    this.route.params.subscribe(params => {
        // do something on parent param change
        let parent_id = params['id']; // set slug
    });

    // child param listener ie: "/:id/:id"
    this.route.firstChild.params.subscribe(params => {
        // do something on child param change
        let child_id = params['id'];
    });

0

Si vous changez d'itinéraire via le lien du routeur, procédez comme suit:

  constructor(public routerNavigate: Router){

         this.router.routeReuseStrategy.shouldReuseRoute = function () {
            return false;
          };

          this.router.events.subscribe((evt) => {

            if (evt instanceof NavigationEnd) {

                this.router.navigated = false;
             }
          })
      }

0

Vous devez utiliser la propriété "onSameUrlNavigation" dans RouterModule, puis vous abonner aux événements Route https://blog.angularindepth.com/refresh-current-route-in-angular-512a19d58f6e


Un lien vers une solution est le bienvenu, mais veuillez vous assurer que votre réponse est utile sans elle: ajoutez du contexte autour du lien afin que vos collègues utilisateurs aient une idée de ce que c'est et pourquoi il est là, puis citez la partie la plus pertinente de la page que vous '' relier au cas où la page cible ne serait pas disponible. Les réponses qui ne sont guère plus qu'un lien peuvent être supprimées.
Alessio du

0

Décide quand la route doit être stockée retourne false à

this.router.routeReuseStrategy.shouldReuseRoute = function () {
    return false;
};

et définissez la valeur de navigation du routeur sur false, ce qui montre que cette route n'a jamais été routée

this.mySubscription = this.router.events.subscribe(event => {
    if (event instanceof NavigationEnd) {
        this.router.navigated = false;
    }
});

0

J'ai essayé quelques correctifs et aucun d'entre eux ne fonctionne. Ma version est simple: ajoutez un nouveau paramètre inutilisé dans les paramètres de requête

            if (force) {
                let key = 'time';

                while (key in filter) {
                    key = '_' + key;
                }

                filter[key] = Date.now();
            }

            this.router.navigate(['.', { filter: JSON.stringify(filter) }]);

0

window.location.replace

// utiliser le backtick pour délimiter la route

window.location.replace ( departments/${this.id}/employees)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.