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的文件是什么文件
Dec 06 Javascript
JQery jstree 大数据量问题解决方法
Mar 09 Javascript
js 第二代身份证号码的验证机制代码
May 12 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
Dec 24 Javascript
jquery操作select详解(取值,设置选中)
Feb 07 Javascript
jQuery插件scroll实现无缝滚动效果
Apr 27 Javascript
简介JavaScript中的unshift()方法的使用
Jun 09 Javascript
H5实现中奖记录逐行滚动切换效果
Mar 13 Javascript
angularJS深拷贝详解
Mar 23 Javascript
在vue中获取token,并将token写进header的方法
Sep 26 Javascript
element-ui组件中input等的change事件中传递自定义参数
May 22 Javascript
浅谈一种让小程序支持JSX语法的新思路
Jun 16 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发明人谈MVC和网站设计架构 貌似他不支持php用mvc
2011/06/04 PHP
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
PHP的基本常识小结
2013/07/05 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
javascript中的prototype属性使用说明(函数功能扩展)
2010/08/16 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
原生JS发送异步数据请求
2017/06/08 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
用python实现面向对像的ASP程序实例
2014/11/10 Python
Python的动态重新封装的教程
2015/04/11 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
python简单实现AES加密和解密
2019/03/28 Python
python命令 -u参数用法解析
2019/10/24 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
女娲补天教学反思
2014/02/05 职场文书
美术国培研修感言
2014/02/12 职场文书
网吧消防安全责任书
2014/07/29 职场文书
公证处委托书
2015/01/28 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书