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 相关文章推荐
flexigrid 类似ext grid的JS表格代码
Jul 17 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
Jun 06 Javascript
JS动态添加iframe的代码
Sep 14 Javascript
分享五个有用的jquery小技巧
Oct 08 Javascript
Bootstrap在线电子商务网站实战项目5
Oct 14 Javascript
JS实现简单的二元方程计算器功能示例
Jan 03 Javascript
使用JavaScript实现alert的实例代码
Jul 06 Javascript
详解Web使用webpack构建前端项目
Sep 23 Javascript
Three.js基础学习之场景对象
Sep 27 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
Jan 16 Javascript
Vue中render方法的使用详解
Jan 26 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
Jun 18 jQuery
解决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
图书管理程序(一)
2006/10/09 PHP
杏林同学录(三)
2006/10/09 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
javascript 面向对象编程基础 多态
2009/08/21 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
python itchat实现微信自动回复的示例代码
2017/08/14 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
PyQt5响应回车事件的方法
2019/06/25 Python
基于python的列表list和集合set操作
2019/11/24 Python
Django 自定义分页器的实现代码
2019/11/24 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
python 获取域名到期时间的方法步骤
2021/02/10 Python
美国名牌太阳镜折扣网站:Eyedictive
2017/05/15 全球购物
大学生求职推荐信
2013/11/27 职场文书
大学毕业感言100字
2014/02/03 职场文书
三方合作协议书范本
2014/04/18 职场文书
安全标语大全
2014/06/10 职场文书
2015年物流客服工作总结
2015/07/27 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL