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 相关文章推荐
javascript import css实例代码
Jul 18 Javascript
JQury slideToggle闪烁问题及解决办法
Jul 05 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
Aug 28 Javascript
利用javascript解决图片缩放及其优化的代码
May 23 Javascript
JS定义网页表单提交(submit)的方法
Mar 20 Javascript
javascript封装简单实现方法
Aug 11 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
Nov 04 Javascript
解析Vue 2.5的Diff算法
Nov 28 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
Nov 28 Javascript
解决vue跨域axios异步通信问题
Apr 17 Javascript
js实现手表表盘时钟与圆周运动
Sep 18 Javascript
在vue中给后台接口传的值为数组的格式代码
Nov 12 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调用三种数据库的方法(2)
2006/10/09 PHP
php面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
php类常量的使用详解
2013/06/08 PHP
基于php常用正则表达式的整理汇总
2013/06/08 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
php实现将Session写入数据库
2015/07/26 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
javascript实现拖放效果
2015/12/16 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
Python 正则表达式操作指南
2009/05/04 Python
Hadoop中的Python框架的使用指南
2015/04/22 Python
Python Selenium参数配置方法解析
2020/01/19 Python
关于Django Models CharField 参数说明
2020/03/31 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
综合素质的自我鉴定
2013/10/07 职场文书
大学活动总结范文
2014/04/29 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
网吧消防安全责任书
2014/07/29 职场文书
重阳节活动总结
2014/08/27 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android