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代码经典广告
Oct 21 Javascript
jquery解析XML字符串和XML文件的方法说明
Feb 21 Javascript
jquery实现背景墙聚光灯效果示例分享
Mar 02 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
Apr 02 Javascript
javascript实现tab切换的两个实例
Nov 05 Javascript
Jquery为DIV添加click事件的简单实例
Jun 02 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
Jan 22 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
详解plotly.js 绘图库入门使用教程
Feb 23 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
Mar 21 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
Nov 14 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
Aug 31 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
深入PHP内存相关的功能特性详解
2013/06/08 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
PHP数组相关函数汇总
2015/03/24 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
几个javascript操作word的参考代码
2009/10/26 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
Python 代码性能优化技巧分享
2012/08/07 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
Hammitt官网:设计师手袋
2020/05/23 全球购物
大专生的学习自我评价
2013/12/04 职场文书
高中毕业的自我鉴定
2013/12/09 职场文书
毕业生应聘求职信
2014/07/10 职场文书
中学生纪念九一八事变演讲稿
2014/09/14 职场文书
2014年工程师工作总结
2014/11/25 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
千与千寻观后感
2015/06/04 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
在redisCluster中模糊获取key方式
2021/07/09 Redis
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL