浅谈Angular6的服务和依赖注入


Posted in Javascript onJune 27, 2018

在开发中,组件一般用来写视图有关的功能,服务则写一些其他的逻辑,诸如从服务器获取数据、验证用户输入或直接往控制台中写日志等工作.

先解释两个概念:

  1. Providers(提供商):是个比较抽象的名词,我们把它想象为'图纸'更好理解一些,就比如我们想要生产汽车,就需要先有汽车的图纸,图纸上记录了生产工艺和材料尺寸之类,这样汽车才生产的出来.provider通常就是自己写的服务类.
  2. Injector(注入器):就是字面上的意思,将某一类事物注入到另一类事物中的工具.angular应用在启动时,会自动创建.

假想一个去医院看病的过程:

找医生看病判断病情,医生开处方 --> 处方交给护士 --> 护士小姐姐根据处方给你注射药物.

这里医生开的处方是providers,将处方交给护士则是将providers注册到injector,护士小姐姐是injector

angular中有很多方式可以将providers注册到injector:

@Injectable 装饰器

在服务类的 @Injectable 装饰器中

//service
  @Injectable({
    providedIn: 'root',
  })

providedIn: 'root' 告诉 Angular在根注入器中注册这个图纸.root 还可以是某一个具体的模块名.

这种方式注册,在代码编译打包时,可以执行摇树优化,这会移除所有没在应用中使用过的服务。摇树优化会使打包体积更小。

@NgModule 中的 providers

在模块的 @NgModule

//service
  @Injectable()
  //module
  @NgModule({
    providers: [
      UserService,
      { provide: APP_CONFIG, useValue: HERO_DI_CONFIG }
    ],
  })

这种方式注册,可以对图纸进行一些额外的配置.

note:在@NgModule中注册的服务,在图纸中也需要写@Injectable()装饰器

在组件中注册

在组件的 @Component 中

@Component({
  selector: 'app-heroes',
  providers: [ HeroService ]

这种方式注册,会注册到每个组件实例自己的注入器上。(多个组件会有多个注入器)

note:服务在每个注入器的范围内是单例的。 在任何一个注入器中,最多只会有同一个服务的一个实例。

不提供图纸

最常见的图纸是class,但是在配置providers: []时,也可以不提供class图纸,而是返回对象的工厂函数,或是对象字面量[{ provide: Logger, useClass: Logger }]

也可以使用useValue属性直接交付一个对象实例,[{ provide: Logger, useValue: silentLogger }]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 输入框内容格式验证代码
Feb 11 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
Jan 21 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
Feb 15 Javascript
js实现一键复制功能
Mar 16 Javascript
利用vue开发一个所谓的数独方法实例
Dec 21 Javascript
使用Angular CLI进行Build(构建)和Serve详解
Mar 24 Javascript
vue2单元测试环境搭建
May 24 Javascript
基于Vue+element-ui 的Table二次封装的实现
Jul 20 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
Nov 13 Javascript
vue实现鼠标移入移出事件代码实例
Mar 27 Javascript
vue-cli webpack配置文件分析
May 20 Javascript
原生JS 实现的input输入时表格过滤操作示例
Aug 03 Javascript
JS实现获取进今年第几天是周几的方法分析
Jun 27 #Javascript
vue+springmvc导出excel数据的实现代码
Jun 27 #Javascript
微信小程序中使用ECharts 异步加载数据的方法
Jun 27 #Javascript
浅谈Webpack下多环境配置的思路
Jun 27 #Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
Jun 27 #Javascript
详解关于vue-area-linkage走过的坑
Jun 27 #Javascript
详解nuxt sass全局变量(公共scss解决方案)
Jun 27 #Javascript
You might like
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
微信小程序云开发之新手环境配置
2019/05/16 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
详解Python中heapq模块的用法
2016/06/28 Python
详解Python3中字符串中的数字提取方法
2017/01/14 Python
Python3 中文文件读写方法
2018/01/23 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
进程的查看和调度分别使用什么命令
2013/12/14 面试题
播音主持专业个人自我评价
2014/01/09 职场文书
公务员个人总结
2015/02/12 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
辞职信格式范文
2015/05/13 职场文书
开工典礼致辞
2015/07/29 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
SQL注入详解及防范方法
2021/12/06 MySQL