博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Angular刷新当前页面的几种方法
阅读量:5830 次
发布时间:2019-06-18

本文共 4280 字,大约阅读时间需要 14 分钟。

默认,当收到导航到当前URL的请求,Angular路由器会忽略。

Heroes

重复点击同一链接页面不会刷新。

从Angular 5.1起提供onSameUrlNavigation属性,支持重新加载路由。

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

onSameUrlNavigation有两个可选值:'reload'和'ignore',默认为'ignore'。但仅将onSameUrlNavigation改为'reload',只会触发RouterEvent事件,页面是不会重新加载的,还需配合其它方法。在继续之前,我们启用Router Trace,从浏览器控制台查看一下路由事件日志:

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

可以看到,未配置onSameUrlNavigation时,再次点击同一链接不会输出日志,配置onSameUrlNavigation为'reload'后,会输出日志,其中包含的事件有:NavigationStart、RoutesRecognized、GuardsCheckStart、GuardsCheckEnd、ActivationEnd、NavigationEnd等。

下面介绍刷新当前页面的几种方法:

NavigationEnd

  1. 配置onSameUrlNavigation为'reload'
  2. 监听NavigationEnd事件

订阅Router Event,在NavigationEnd中重新加载数据,销毁组件时取消订阅:

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();    }  }  ...}

这种方式可按需配置要刷新的页面,但代码烦琐。

RouteReuseStrategy

  1. 配置onSameUrlNavigation为'reload'
  2. 自定义RouteReuseStrategy,不重用Route

有两种实现方式:

在代码中更改策略:

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

Angular应用Router为单例对象,因此使用这种方式,在一个组件中更改策略后会影响其他组件,但从浏览器刷新页面后Router会重新初始化,容易造成混乱,不推荐使用。

自定义RouteReuseStrategy:

import {ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy} from '@angular/router';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;  }}

使用自定义RouteReuseStrategy:

@NgModule({  imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})],  exports: [RouterModule],  providers: [    {provide: RouteReuseStrategy, useClass: CustomReuseStrategy}  ]})

这种方式可以实现较为复杂的Route重用策略。

Resolve

使用Resolve可以预先从服务器上获取数据,这样在路由激活前数据已准备好。

  1. 实现ResolverService

将组件中的初始化代码转移到Resolve中:

import {Injectable} from '@angular/core';import {ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} from '@angular/router';import {Observable} from 'rxjs';import {HeroService} from '../hero.service';import {Hero} from '../hero';@Injectable({  providedIn: 'root',})export class HeroesResolverService implements Resolve
{ constructor(private heroService: HeroService) { } resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable
| Observable
{ return this.heroService.getHeroes(); }}

为路由配置resolve:

path: 'heroes', component: HeroesComponent, canActivate: [CanActivateAuthGuard], resolve: {heroes: HeroesResolverService}
  1. 修改组件代码,改为从resolve中获取数据
constructor(private heroService: HeroService, private route: ActivatedRoute) {}ngOnInit() {  this.route.data.subscribe((data: { heroes: Hero[] }) => {    this.heroes = data.heroes;  });}
  1. 配置onSameUrlNavigation为'reload'
  2. 配置runGuardsAndResolvers为‘always’

runGuardsAndResolvers可选值:'paramsChange' 、'paramsOrQueryParamsChange'、'always'

{path: 'heroes', component: HeroesComponent, canActivate: [CanActivateAuthGuard], resolve: {heroes: HeroesResolverService}, runGuardsAndResolvers: 'always'}

时间戳

给Router增加时间参数:

Heroes
constructor(private router: Router) {}gotoHeroes() {  this.router.navigate(['/heroes'], {    queryParams: {refresh: new Date().getTime()}  });}

然后在组件中订阅queryParamMap:

constructor(private heroService: HeroService, private route: ActivatedRoute) {  this.route.queryParamMap.subscribe(params => {    if (params.get('refresh')) {      this.init();    }  });}

2018广州马拉松

Angular刷新当前页面的几种方法

转载于:https://blog.51cto.com/7308310/2335107

你可能感兴趣的文章
MySQL增量订阅&消费组件Canal POC
查看>>
Sqlite多线程
查看>>
数据结构-时间复杂度
查看>>
对象与字符串相互转换
查看>>
[NOIp2017提高组]小凯的疑惑
查看>>
《C程序设计语言》练习1-5
查看>>
$\frac{dy}{dx}$ 是什么意思?
查看>>
Go开发之路(目录)
查看>>
RHEL6.5安装成功ORACLE11GR2之后,编写PROC程序出错解决方法
查看>>
(50)与magento集成
查看>>
Ubuntu设置python3为默认版本
查看>>
JsonCpp 的使用
查看>>
问题账户需求分析
查看>>
JavaSE-代码块
查看>>
爬取所有校园新闻
查看>>
32、SpringBoot-整合Dubbo
查看>>
python面向对象基础
查看>>
HDU 2044 一只小蜜蜂(递归)
查看>>
docker 下 安装rancher 笔记
查看>>
spring两大核心对象IOC和AOP(新手理解)
查看>>