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 相关文章推荐
邮箱下拉自动填充选择示例代码附图
Apr 03 Javascript
For循环中分号隔开的3部分的执行顺序探讨
May 27 Javascript
Javascript实现简单的富文本编辑器附演示
Jun 16 Javascript
JS给Textarea文本框添加行号的方法
Aug 20 Javascript
js操作数据库实现注册和登陆的简单实例
May 26 Javascript
AngularJS ng-style中使用filter
Sep 21 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
Jun 26 jQuery
VUE页面中加载外部HTML的示例代码
Sep 20 Javascript
详解JavaScript作用域和作用域链
Mar 19 Javascript
通过实例讲解JS如何防抖动
Jun 15 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
Mar 05 Javascript
全网小程序接口请求封装实例代码
Nov 06 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 ajax异步读取rss文档数据
2016/03/29 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python Web服务器Tornado使用小结
2014/05/06 Python
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
python中星号变量的几种特殊用法
2016/09/07 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
Python如何给你的程序做性能测试
2020/07/29 Python
Python Map 函数的使用
2020/08/28 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
美国美妆网站:B-Glowing
2016/10/12 全球购物
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
2015年全民创业工作总结
2015/07/23 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL