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 相关文章推荐
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
Sep 22 Javascript
js中将多个语句写成一个语句的两种方法小结
Dec 08 Javascript
JavaScript初学者应注意的七个细节小结
Jan 30 Javascript
extjs中form与grid交互数据(record)的方法
Aug 29 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
Sep 22 Javascript
javascript中字符串的定义示例代码
Dec 19 Javascript
JavaScript 学习笔记之变量及其作用域
Jan 14 Javascript
jQuery日历插件datepicker用法详解
Mar 03 Javascript
TypeScript Type Innference(类型判断)
Mar 10 Javascript
JavaScript+CSS相册特效实例代码
Sep 07 Javascript
webpack中的热刷新与热加载的区别
Apr 09 Javascript
vue-dplayer 视频播放器实例代码
Nov 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
PHP编程中字符串处理的5个技巧小结
2007/11/13 PHP
两级联动select刷新后其值保持不变的实现方法
2014/01/27 PHP
分享下php5类中三种数据类型的区别
2015/01/26 PHP
PHP加密解密实例分析
2015/12/25 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
laravel学习教程之关联模型
2016/07/30 PHP
javascript Object与Function使用
2010/01/11 Javascript
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
JavaScript函数详解
2015/02/27 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
2019/04/08 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
2019/07/29 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
python之yield表达式学习
2014/09/02 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
python字典的常用操作方法小结
2016/05/16 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
对pandas中Series的map函数详解
2018/07/25 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
Python发送邮件实现基础解析
2020/08/14 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
汽车技术服务英文求职信范文
2014/01/02 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
Python基础之进程详解
2021/05/21 Python
浅谈MySQL函数
2021/10/05 MySQL