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 相关文章推荐
提高 DHTML 页面性能
Dec 25 Javascript
jquery实现ajax提交form表单的方法总结
Mar 03 Javascript
js获取IP地址的方法小结
Jul 01 Javascript
javascript实现日期时间动态显示示例代码
Sep 08 Javascript
JSP基于Bootstrap分页显示实例解析
Jun 12 Javascript
jquery动态遍历Json对象的属性和值的方法
Jul 27 Javascript
jQuery实现页面点击后退弹出提示框的方法
Aug 24 Javascript
javascript中mouseenter与mouseover的异同
Jun 06 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
Jan 31 Javascript
layui+jquery支持IE8的表格分页方法
Sep 28 jQuery
JavaScript 生成唯一ID的几种方式
Feb 19 Javascript
vue-cli中实现响应式布局的方法
Mar 02 Vue.js
解决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
再说下636单管机
2021/03/02 无线电
PHP基础学习小结
2011/04/17 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
brook javascript框架介绍
2011/10/10 Javascript
jQuery多项选项卡的实现思路附样式及代码
2014/06/03 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
快速搭建vue2.0+boostrap项目的方法
2018/04/09 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
javascript显示动态时间的方法汇总
2018/07/06 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
python使用psutil模块获取系统状态
2016/08/27 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
python之PyMongo使用总结
2017/05/26 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
总经理助理的八要求
2013/11/12 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
运动员代表致辞
2015/07/29 职场文书