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通过googleAIP翻译PHP系统的语言配置的实现代码
Oct 17 Javascript
5秒后跳转到另一个页面的js代码
Oct 12 Javascript
使用Js让Html中特殊字符不被转义
Nov 05 Javascript
showModelDialog弹出文件下载窗口的使用示例
Nov 19 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
Oct 22 Javascript
javascript弹出页面回传值的方法
Jan 28 Javascript
ES5 ES6中Array对象去除重复项的方法总结
Apr 27 Javascript
js隐式转换的知识实例讲解
Sep 28 Javascript
JavaScript实现飞舞的泡泡效果
Feb 07 Javascript
JS eval代码快速解密实例解析
Apr 23 Javascript
vue实现移动端拖动排序
Aug 21 Javascript
详解Vue中Axios封装API接口的思路及方法
Oct 10 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
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
学习jquery之一
2007/04/27 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
详细解读Python中的__init__()方法
2015/05/02 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
Python3+Appium安装使用教程
2019/07/05 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
甲方资料员岗位职责
2013/12/13 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
婚前协议书范本
2014/10/27 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
走近毛泽东观后感
2015/06/04 职场文书
安全生产感想
2015/08/07 职场文书
python tkinter模块的简单使用
2021/04/07 Python
ipad隐藏软件app图标方法
2022/04/19 数码科技