浅谈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 String对象扩展HTML编码和解码的方法
Jun 02 Javascript
javascript打印大全(打印页面设置/打印预览代码)
Mar 29 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
May 06 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
Jun 27 Javascript
Jquery实现由下向上展开效果的例子
Dec 08 Javascript
JS中的二叉树遍历详解
Mar 18 Javascript
jQuery实现简单的网页换肤效果示例
Sep 18 Javascript
js html5 css俄罗斯方块游戏再现
Oct 17 Javascript
vue使用watch 观察路由变化,重新获取内容
Mar 08 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
Mar 15 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
Nov 30 Javascript
JS中的BOM应用
Feb 02 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分页显示制作详细讲解
2006/12/05 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
实现获取http内容的php函数分享
2014/02/16 PHP
php查看网页源代码的方法
2015/03/13 PHP
PHP实现图片压缩
2020/09/09 PHP
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
教师自荐信范文
2013/12/09 职场文书
旷课检讨书3000字
2014/02/04 职场文书
社区党务公开实施方案
2014/03/18 职场文书
会员活动策划方案
2014/08/19 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
2016十一国庆节感言
2015/12/09 职场文书
高中生社会实践心得体会
2016/01/14 职场文书