博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Angular技巧汇总
阅读量:6186 次
发布时间:2019-06-21

本文共 2886 字,大约阅读时间需要 9 分钟。

hot3.png

一、声明全局的类型定义

    声明项目的全局类型,同时不需要在各个Ts文件中import {XXX} from 'xxx'  ,就能直接引用!方法是:

     增加src/typings.d.ts文件 ,在文件中增加  interface IName {  name:string ; } 的类型定义。

     那么IName这个类型在所有的TS文件中自动可以访问 ! 

    注意:不要在代码前增加  export 的关键字。   

    参考:

二、在懒加载指定模块前,动态加载一个js文件。

     通常我们在项目中引用第三方包,一种是import 方法,其代码最终是打包一起;一种是配置angular.json文件,其中有scripts : [] ,在里面增加相应的js完整路径达到引用js文件, 其代码不参与构建,会在首页加载时,做为普通的外挂脚本文件引入。

     无论是打包在一起,还是外挂脚本,都是会增加初始加载的负担!比如echarts.js 有800kb的大小,在初始的登录页面,用户根本用不到图表的功能,甚至进入主界面的模块后,也不需要加载它, 当仅我在点击到某些有图表页面的页面时,才必须加载echarts.js文件。我们的项目代码通常会拆分成多个“功能模块”,每个模块负责一组功能相近的页面,这些模块可以懒加载,就是当路由到相关页面时,才去加载模块。

     那么如何实现,在懒加载模块时,动态的引入一个依赖js文件?

    这里用到两个技术:

   1、解析路由守卫,参考,   路由守卫有三种:

  •      激活守卫     :  在函数返回true时,才能进入路由页面。
  •      离开守卫 :  在函数返回true时,才能离开路由页面。
  •      解析守卫          :   在函数返回的Promise对象成功后,才进入路由页面。

  2、动态插入js脚本。

    先new  Promise() 后,创建一个<script>的dom元素指向动态加载的js文件,并监听它的onload事件,然后把它插入到页面的头部。当加载成功后,让Promise对象resolve即可。

    完整的代码:

先定义一个PreloadScriptResolver服务:

@Injectable({  providedIn: 'root'})export class PreloadScriptResolver implements Resolve
{ // 1、全局可动态插入的js列表。 private scripts: any = { echarts: { loaded: false, src: "assets/lib/echarts.min.js" }, canvasGauges: { loaded: false, src: "assets/lib/gauge.min.js" }, sockjs: { loaded: false, src: "assets/lib/sockjs.min.js" } }; load(...scripts: string[]) { const promises = scripts.map(script => this.loadScript(script)); return Promise.all(promises); } loadScript(name: string): Promise
{ return new Promise((resolve, reject) => { if (this.scripts[name].loaded) { // 防止多次加载 resolve({ script: name, loaded: true, status: 'Already Loaded' }); } else { // 2、动态插入js文件 const script = document.createElement('script'); script.type = 'text/javascript'; script.src = this.scripts[name].src; script.onload = () => { this.scripts[name].loaded = true; resolve({ script: name, loaded: true, status: 'Loaded' }); }; script.onerror = (error: any) => reject({ script: name, loaded: false, status: 'Loaded Error:' + error.toString() }); document.head.appendChild(script); } }); } // 3、解析守卫从当前路由的data.preloadScripts中取到依赖的js列表,并加载它们 resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise
{ return this.load(...route.routeConfig.data.preloadScripts); }}

去相应模块的路由定义文件中:

const routes: Routes = [  {    path: "",    component: DashboardComponent,    resolve: {      preloadScripts: PreloadScriptResolver      },    data: {      preloadScripts: ["echarts", "canvasGauges", "sockjs"]  // 5、传入当前路由依赖的js列表    },    children: [      {          path: "widgets",    。。。。。。   }

三、http请求返回200,响应体是一个空格时,报错。

在Angular中,使用HttpClient请求时, 如果this.http.get("url"}后,响应结果不走成功,直接进入error,但是控制台中的网络中,显示状态码是200, 且控制台打印报告“Unexpected end of JSON input” ,就是这种情况了。

此时需要增加一个参数:this.http.get( url  , {responseType: 'text'});  

 

 

 

 

 

 

转载于:https://my.oschina.net/u/1540190/blog/1935692

你可能感兴趣的文章
js里实现给数字加三位一逗号间隔的两种方法
查看>>
DOS命令大全(经典收藏)
查看>>
Android数字选择器-NumberPicker
查看>>
zoj 3547 The Boss on Mars 第36届ACM大连预选赛I题
查看>>
javascript基础
查看>>
小学生四则运算应用软件(二)
查看>>
jQuery事件 JS选择器及相关
查看>>
golang 简单web服务
查看>>
shell(2):传入参数
查看>>
cobbler安装配置.基本全了多看help和docs
查看>>
day05-05 for循环、break
查看>>
图像处理之基础---傅立叶c实现
查看>>
使用Jquery后去div个数
查看>>
页面添加二维码的实现方法
查看>>
c# 扩展方法奇思妙用基础篇七:IsBetween 通用扩展
查看>>
python之反射--选课例子
查看>>
《Java程序设计》 第一周学习任务(1)
查看>>
每天进步一点点 3-23
查看>>
windows下PyCharm安装及使用
查看>>
53. Maximum Subarray
查看>>