Angular resolve基础用法详解


Posted in Javascript onOctober 03, 2018

简介

为什么使用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守卫>

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

Javascript 相关文章推荐
JS类中定义原型方法的两种实现的区别
Mar 08 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
Dec 18 Javascript
TinyMCE汉化及本地上传图片功能实例详解
May 31 Javascript
JS中使用DOM来控制HTML元素
Jul 31 Javascript
jquery easyui validatebox remote的使用详解
Nov 09 Javascript
JavaScript数组复制详解
Feb 02 Javascript
canvas实现探照灯效果
Feb 07 Javascript
AngularJS 验证码60秒倒计时功能的实现
Jun 05 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
Feb 28 Javascript
详解angularjs跨页面传参遇到的一些问题
Nov 01 Javascript
vue实现带复选框的树形菜单
May 27 Javascript
原生js 实现表单验证功能
Feb 08 Javascript
解决angularjs service中依赖注入$scope报错的问题
Oct 02 #Javascript
angular.js实现列表orderby排序的方法
Oct 02 #Javascript
Angularjs实现数组随机排序的方法
Oct 02 #Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
Oct 02 #Javascript
angularjs获取到My97DatePicker选中的值方法
Oct 02 #Javascript
angular ng-model 无法获取值的处理方法
Oct 02 #Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 #Javascript
You might like
用libTemplate实现静态网页的生成
2006/10/09 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
PHP时间函数使用详解
2019/03/21 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
js Date概念详细介绍
2013/11/22 Javascript
javascript常用方法汇总
2014/12/02 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
详解AngularJS中module模块的导入导出
2015/12/10 Javascript
浅析javascript函数表达式
2016/02/10 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
vue实现文件上传功能
2018/08/13 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
详解js访问对象的属性和方法
2018/10/25 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
python 上下文管理器使用方法小结
2017/10/10 Python
浅谈Python爬虫基本套路
2019/03/25 Python
python数据归一化及三种方法详解
2019/08/06 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
python算的上脚本语言吗
2020/06/22 Python
莫斯科大型旅游休闲商品超市:Camping.ru
2020/09/16 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
学校安全工作制度
2014/01/19 职场文书
大学秋游活动方案
2014/02/11 职场文书
成绩单公证书
2014/04/10 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书