Angular resolve基础用法详解

 更新时间:2018年10月03日 08:46:00   作者:SwitchCase_  
resolve保证了数据获取后再进行路由跳转,防止因为数据延迟而出现短暂的空组件情况,本文就介绍一下Angular resolve基础用法,感兴趣的小伙伴们可以参考一下

简介

为什么使用resolve:

当路由切换的时候,被路由的页面中的元素(标签)就会立马显示出来,同时,数据会被准备好并呈现出来。但是注意,数据和元素并不是同步的,在没有任何设置的情况下,AngularJS默认先呈现出元素,而后再呈现出数据。这样就会导致页面会被渲染两遍,导致“页面UI抖动”的问题,对用户不太友好。resolve的出现解决了这个问题。

resolve是干嘛用的:

resolve属性里的值会在路由成功前被预先设定好,然后注入到控制器中。通俗地将,就是等数据都“就位”后,才进行路由(其实我觉得也不能叫路由,因为路由是一些列的操作,其中就包括了设置resolve属性等等)。这样的好处就是页面仅会被渲染一遍。

这样,我们就可以通过这种方式来动态加载相应的文件,减轻首页加载的负担。

一、使用场景

resolve保证了数据获取后再进行路由跳转,防止因为数据延迟而出现短暂的空组件情况,以此增强用户体验。

应用resolve还可以进行路由拦截,例如某些网站如果用户未登录,在跳转到某一页面时会提示未登录然后强行回跳至前一页面,这时如果使用resolve就可以在跳转发生前判断登录状态以决定是否允许跳转。

二、基础用法

示例中跳转逻辑为 home.component => resolve.service => detail.component

home-routing.module.ts

import { NgModule }    from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

import { DetailResolver }  from './detail-resolver.service';
import { DetailComponent }  from './detail.component';

const routes: Routes = [
 {
 path: ':id',
 component: DetailComponent,
 resolve: { // 此处使用resolve
  detail: DetailResolver
 }
 },
];
@NgModule({
 imports: [
 RouterModule.forChild(routes)
 ],
 exports: [
 RouterModule
 ],
 providers: [
 DetailResolver
 ]
})
export class HomeRoutingModule { }

detail-resolver.service.ts

import { Injectable }    from '@angular/core';
import { Router, Resolve, RouterStateSnapshot,
   ActivatedRouteSnapshot } from '@angular/router';
import { Observable }    from 'rxjs';
import { map, take }    from 'rxjs/operators';

import { detail, DetailService } from './detail.service';

@Injectable()
export class DetailResolver implements Resolve<Detail> {
 constructor(private detailService: DetailService, private router: Router) {}

 resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Detail> {
 let id = route.paramMap.get('id');

 return this.detailService.getDetail(id).pipe(
  take(1), // 可选,只发出源 Observable 最初发出的的1个值
  map(res => {
  if (res) {
   return res;
  } else { // 请求失败时拦截跳转
   this.router.navigate(['/home']);
   return null;
  }
  })
 );
 }
}

由路由器提供的 Observable 必须完成,否则导航不会继续。

detail.component.ts

// 通过 route 获取 detail-resolver.service 中 detailService.getDetail 请求的数据
ngOnInit() {
 this.route.data
 .subscribe((data: { detail: Detail }) => {
  this.detail = data.detail; 
 });
}

参考Angular中文网 <Resolve: 预先获取组件数据>

API地址 <resolve守卫>

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • angular-ngSanitize模块-$sanitize服务详解

    angular-ngSanitize模块-$sanitize服务详解

    本篇文章主要介绍了angular-ngSanitize模块-$sanitize服务详解 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • AngularJS中$http的交互问题

    AngularJS中$http的交互问题

    本篇文章主要介绍了AngularJS中$http的交互问题 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • angular2组件中定时刷新并清除定时器的实例讲解

    angular2组件中定时刷新并清除定时器的实例讲解

    今天小编就为大家分享一篇angular2组件中定时刷新并清除定时器的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • AngularJS指令与指令之间的交互功能示例

    AngularJS指令与指令之间的交互功能示例

    这篇文章主要介绍了AngularJS指令与指令之间的交互功能,结合实例形式分析了AngularJS指令交互操作相关实现技巧,需要的朋友可以参考下
    2016-12-12
  • Angular2 自定义表单验证器的实现方法

    Angular2 自定义表单验证器的实现方法

    这篇文章主要介绍了Angular2 自定义表单验证器的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 使用AngularJS 跨站请求如何解决jsonp请求问题

    使用AngularJS 跨站请求如何解决jsonp请求问题

    这篇文章主要介绍了使用AngularJS 跨站请求如何解决jsonp请求问题,下面通过本文给大家分享解决办法,需要的朋友参考下
    2017-01-01
  • AngularJS使用ng-repeat遍历二维数组元素的方法详解

    AngularJS使用ng-repeat遍历二维数组元素的方法详解

    这篇文章主要介绍了AngularJS使用ng-repeat遍历二维数组元素的方法,结合实例形式分析了AngularJS二维数组元素遍历的相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • 利用Angular.js限制textarea输入的字数

    利用Angular.js限制textarea输入的字数

    相信在大家已经学习了足够多关于AngularJS的知识后,就可以开始创建第一个AngularJS应用程序,这篇文章通过示例给大家介绍如何利用Angular.js限制textarea输入的字数,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • Angularjs实现分页和分页算法的示例代码

    Angularjs实现分页和分页算法的示例代码

    分页是很多web应用都会用到的,本篇文章主要介绍了Angularjs实现分页和分页算法的示例代码,具有一定的参考价值,有兴趣的可以了解一下。
    2016-12-12
  • Angular.js组件之input mask对input输入进行格式化详解

    Angular.js组件之input mask对input输入进行格式化详解

    这篇文章主要给大家介绍了关于Angular.js组件之input mask对input输入进行格式化的相关内容,文中通过示例代码详细介绍了将银行卡号和日期的方法,需要的朋友们可以参考借鉴,下面来一起看看吧。
    2017-07-07

最新评论