Home > Web Front-end > JS Tutorial > How to refresh the current page in Angular? Method introduction

How to refresh the current page in Angular? Method introduction

青灯夜游
Release: 2021-04-08 11:59:15
forward
4234 people have browsed it

This article will share with you several Angular methods to refresh the current page. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to everyone.

How to refresh the current page in Angular? Method introduction

Angular's several methods of refreshing the current page


By default, when a request to navigate to the current URL is received, Angular router will ignore it.

<a routerLink="/heroes" routerLinkActive="active">Heroes</a>
Copy after login

The page will not refresh if you click the same link repeatedly.

The onSameUrlNavigation attribute is provided from Angular 5.1 to support reloading routes.

@NgModule({
  imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: &#39;reload&#39;})],
  exports: [RouterModule]
})
Copy after login

onSameUrlNavigation has two optional values: 'reload' and 'ignore', the default is 'ignore'. But just changing onSameUrlNavigation to 'reload' will only trigger the RouterEvent event, and the page will not be reloaded. Other methods need to be used. Before continuing, we enable Router Trace and check the routing event log from the browser console:

@NgModule({
  imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: &#39;reload&#39;, enableTracing: true})],
  exports: [RouterModule]
})
Copy after login

You can see that when onSameUrlNavigation is not configured, clicking the same link again will not output the log. Configure onSameUrlNavigation as 'reload ', a log will be output, which contains events: NavigationStart, RoutesRecognized, GuardsCheckStart, GuardsCheckEnd, ActivationEnd, NavigationEnd, etc.

Related tutorial recommendations: "angular tutorial"

The following introduces several methods of refreshing the current page:

NavigationEnd

1. Configure onSameUrlNavigation as 'reload'

2. Listen to NavigationEnd event

Subscribe to Router Event, reload data in NavigationEnd, and destroy the component Unsubscribe:

export class HeroesComponent implements OnDestroy {
  heroes: Hero[];
  navigationSubscription;

  constructor(private heroService: HeroService, private router: Router) {
    this.navigationSubscription = this.router.events.subscribe((event: any) => {
      if (event instanceof NavigationEnd) {
        this.init();
      }
    });
  }

  init() {
    this.getHeroes();
  }

  ngOnDestroy() {
    if (this.navigationSubscription) {
      this.navigationSubscription.unsubscribe();
    }
  }
  ...
}
Copy after login

This method can configure the page to be refreshed as needed, but the code is cumbersome.

RouteReuseStrategy

1. Configure onSameUrlNavigation to 'reload'

2. Customize RouteReuseStrategy and do not reuse Route

There are two implementation methods:
Change the strategy in code:

constructor(private heroService: HeroService, private router: Router) {
  this.router.routeReuseStrategy.shouldReuseRoute = function () {
    return false;
  };
}
Copy after login

Angular applies Router as a singleton object, so using this method, changing the strategy in one component will affect other component, but the Router will be re-initialized after refreshing the page from the browser, which can easily cause confusion and is not recommended.

Customized RouteReuseStrategy:

import {ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy} from &#39;@angular/router&#39;;

export class CustomReuseStrategy implements RouteReuseStrategy {

  shouldDetach(route: ActivatedRouteSnapshot): boolean {
    return false;
  }

  store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle | null): void {
  }

  shouldAttach(route: ActivatedRouteSnapshot): boolean {
    return false;
  }

  retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null {
    return null;
  }

  shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
    return false;
  }

}
Copy after login

Use custom RouteReuseStrategy:

@NgModule({
  imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: &#39;reload&#39;})],
  exports: [RouterModule],
  providers: [
    {provide: RouteReuseStrategy, useClass: CustomReuseStrategy}
  ]
})
Copy after login

This method can implement a more complex Route reuse strategy.

Resolve

Using Resolve, you can obtain data from the server in advance, so that the data is ready before the route is activated.

1. Implement ResolverService

Transfer the initialization code in the component to Resolve:

import {Injectable} from &#39;@angular/core&#39;;
import {ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} from &#39;@angular/router&#39;;
import {Observable} from &#39;rxjs&#39;;

import {HeroService} from &#39;../hero.service&#39;;
import {Hero} from &#39;../hero&#39;;

@Injectable({
  providedIn: &#39;root&#39;,
})
export class HeroesResolverService implements Resolve<Hero[]> {
  constructor(private heroService: HeroService) {
  }

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Hero[]> | Observable<never> {
    return this.heroService.getHeroes();
  }
}
Copy after login

Configure resolver for routing:

path: &#39;heroes&#39;, component: HeroesComponent, canActivate: [CanActivateAuthGuard], resolve: {heroes: HeroesResolverService}
Copy after login

2. Modify the component Code, change to get data from resolve

constructor(private heroService: HeroService, private route: ActivatedRoute) {
}

ngOnInit() {  this.route.data.subscribe((data: { heroes: Hero[] }) => {    this.heroes = data.heroes;
  });
}
Copy after login

3. Configure onSameUrlNavigation as 'reload'

4. Configure runGuardsAndResolvers as 'always'

runGuardsAndResolvers optional values: 'paramsChange', 'paramsOrQueryParamsChange', 'always'

{path: &#39;heroes&#39;, component: HeroesComponent, canActivate: [CanActivateAuthGuard], resolve: {heroes: HeroesResolverService}, runGuardsAndResolvers: 'always'}
Copy after login

Time stamp

Add time parameters to Router:

<a (click)="gotoHeroes()">Heroes</a>
Copy after login
constructor(private router: Router) {
}

gotoHeroes() {  this.router.navigate([&#39;/heroes&#39;], {    queryParams: {refresh: new Date().getTime()}
  });
}
Copy after login

Then subscribe to queryParamMap in the component:

constructor(private heroService: HeroService, private route: ActivatedRoute) {
  this.route.queryParamMap.subscribe(params => {
    if (params.get(&#39;refresh&#39;)) {
      this.init();
    }
  });
}
Copy after login

For more programming-related knowledge, please visit: Programming Video! !

The above is the detailed content of How to refresh the current page in Angular? Method introduction. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template