浅谈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 相关文章推荐
动态表格Table类的实现
Aug 26 Javascript
一个网页标题title的闪动提示效果实现思路
Mar 22 Javascript
javascript定义变量时有var和没有var的区别探讨
Jul 21 Javascript
JS实现仿新浪黄色经典滑动门效果代码
Sep 27 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
Dec 17 Javascript
AngularJs基本特性解析(一)
Jul 21 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
Apr 18 Javascript
微信小程序通过api接口将json数据展现到小程序示例
Jan 20 Javascript
使用nvm管理不同版本的node与npm的方法
Oct 31 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
Nov 02 Javascript
JavaScript常用工具方法封装
Feb 12 Javascript
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
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
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
php简单的会话类代码
2011/08/08 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
PHP递归删除目录几个代码实例
2014/04/21 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
一些技巧性实用js代码小结
2009/10/14 Javascript
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
jQuery 渐变下拉菜单
2009/12/15 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
js+html制作简单日历的方法
2017/06/27 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Python操作MySQL数据库的三种方法总结
2018/01/30 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
Python的高阶函数用法实例分析
2019/04/11 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
环境工程大学生个人的自我评价
2013/10/08 职场文书
办公室内勤岗位职责范本
2013/12/09 职场文书
咖啡蛋糕店创业计划书
2014/01/28 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
教师个人教学总结
2015/02/11 职场文书
靠谱准确的求职信
2019/04/02 职场文书
小学作文之描写天气
2019/08/15 职场文书
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android