Angular4.0基础知识之组件

Angular4.0基础知识之路由

Angular4.0依赖注入

Angular4.0数据绑定&管道

依赖注入(Dependency Injection)

正常情况下,我们写的代码应该是这样子的:

let product = new Product();	// 实例化一个对象
createOrder(product); // 调用方法传入商品对象,生成订单

createOrder方法依赖product类,但是createOrder方法自身并不知道也不能去创建一个product对象。我们把方法所需的对象实例化并当做参数传入,这个过程就成为把参数注入给这个方法。在此你可能看不出什么,但是如果依赖的对象比较多了呢?我们需要反复去new,反复去生成对象,然后传入到方法中......想想就是噩梦。

那么,能不能让某人替我们创建createOrder所依赖的对象和对象所依赖的其他对象呢?如果可以的话,那么,我们只需要写一句方法的调用即可,对象都将会呗自动创建好,并当做参数传递进去(想想就很美妙,懒人必备啊)。

也就是说,对象A只需要声明,我需要一个B类型的对象,那么这个对象就会从外部注入进来,这就是依赖注入要解决的问题。

与依赖注入经常同时出现的另一个概念叫做控制反转(Inversion Of Control),简称IOC。

控制反转是指将依赖的控制权从代码的内部转移到代码的外部,如上代码所示,方法所需的依赖是由方法的内部所决定的,如果需要改变依赖,就需要修改方法内部的代码,外面不管是传入Product的实例,还是传入Product子类的实例,是有方法外部决定的。

IOC着重描述目的;DI着重描述实现的方法,即如何去实现控制反转。实现了控制反转模式的框架被称为IOC容器。

实现依赖注入

那么如何在Angular中实现以来注入呢?

定义提供器

首先,使用命令行工具生成一个service,用于提供注入服务。

ng g service shared/product

由于product是共享的,所以放到了一个自定义的shared文件夹

接下来,对生成的服务进行编辑(由于当前没有对这个服务进行注册,显然不会生效)

import {Injectable} from '@angular/core';

@Injectable()
export class ProductService { constructor() { } getProduct(): Product {
return new Product(1, '小米Mix', 3999, '很666的手机');
} } /**
* 定义一个Product商品类
*/
export class Product {
constructor(public id: number, public title: string, public price: number, public desc: string) { }
}

下面,进入app.module,注册服务

...
providers: [ProductService],
...

在使用的时候(需要获取product对象的时候,直接在构造函数中声明需要Product类型的变量,即可完成注入。

constructor (product:Product){  }

这时候,注入提供器声明在了模块中,也可以在组件的@component()中添加providers属性,这时候,作用域就变成了当前组件,并且组件中声明的提供器比模块的优先级更高

使用工厂声明提供器

如果在实例化类的时候需要传递参数,或需要进行一些操作去得到一个注入对象,那么使用工厂声明一个提供器是更好的解决办法。

providers: [{
provide: ProductService,
useFactory: () => {
const dev = Math.random() > 0.5;
if (dev) {
return new Product(1, '小米6', 2999, '很6的手机');
} else {
return new Product(2, '小米mix', 3999, '很美的手机');
}
}
}],

那么,如果工厂方法依赖一个LoggerService,我们如何去解耦合并把loggerServices注入到工厂方法呢?需要使用第三个参数:

providers: [{
provide: ProductService,
useFactory: (logger:LoggerService) => {
const dev = Math.random() > 0.5;
if (dev) {
return new Product(1, '小米6', 2999, '很6的手机');
} else {
return new Product(2, '小米mix', 3999, '很美的手机');
}
},
deps:[LoggerService]
},LoggerService],

如此,即可实现工厂方法的依赖注入

使用具体的值定义提供器

providers: [{
provide: ProductService,
useFactory: (logger:LoggerService,appConfig) => {
if (appConfig.isDev) {
return new Product(1, '小米6', 2999, '很6的手机');
} else {
return new Product(2, '小米mix', 3999, '很美的手机');
}
},
deps:[LoggerService,"APP_CONFIG"]
},LoggerService,{
provide:"APP_CONFIG",
useValue:{isDev:false}
}],

注意,被注入的类都需要有一个@Injectable()装饰器,这样才能被注入

那么你可能会疑惑了,angular组件控制器的类并没有@Injecdtable()装饰器,但是构造函数却能被注入,这是因为@component()装饰器的实现一键集成了@Injectable()

为了更容易理解,接下来实现一下手工注入:

import {Injector} from '@angular/core';

export class ProductComponent implements OnInit {

  private product: ProductService;

  constructor(private injector: Injector) {
this.product = injector.get(ProductService);
}
}

Angular的依赖注入只有一个注入点,也就是构造函数。

Angular4.0从入门到实战打造在线竞拍网站学习笔记之三--依赖注入的更多相关文章

  1. Angular4.0从入门到实战打造在线竞拍网站学习笔记之一--组件

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 Angular4.0数据绑定&管道 最近搞到手了一部Angular4的视频教程,这几天正好 ...

  2. Angular4.0从入门到实战打造在线竞拍网站学习笔记之四--数据绑定&管道

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 数据绑定 数据绑定允许你将组件控制器的属性和方法与组件的模板连接起来,大大降低了开发时的编码量. ...

  3. Angular4.0从入门到实战打造在线竞拍网站学习笔记之二--路由

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 Angular4.0数据绑定&管道 路由 简介 接下来学习路由的相关知识 本来是不准备写下 ...

  4. Angular4.0学习笔记 从入门到实战打造在线竞拍网站学习笔记之二--路由

    Angular4.0基础知识见上一篇博客 路由 简介 接下来学习路由的相关知识 本来是不准备写下去的,因为当时看视频学的时候感觉自己掌握的不错 ( 这是一个灰常不好的想法 ) ,过了一段时间才发现An ...

  5. Angular 4 学习笔记 从入门到实战 打造在线竞拍网站 基础知识 快速入门 个人感悟

    最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app. 环境&版本信息声明 运行ng -v @angular/ ...

  6. Swoole入门到实战 打造高性能 赛事直播平台(完整版)

    Thinkphp+Swoole入门到实战打造高性能赛事直播平台 第1章 课程介绍 欢迎大家来到swoole的课程!本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司 ...

  7. swoole入门到实战打造高性能赛事直播平台☆

    ​ 第1章 课程介绍 本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司的一些案例,最后重点讲解了swoole学习的一些准备工作. 第2章 PHP 7 源码安装 本 ...

  8. 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程

    点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...

  9. 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入

    系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...

随机推荐

  1. Android 7.0 安装器安装过程分析 (com.android.packageinstaller)

    1 安装入口PackageInstallerActivity,这个类只是在安装前做准备.通过各种校验,然后弹出被安装应用的权限框,等待用户安装.具体的流程如下 1.1  求mSessionId 如果是 ...

  2. FutureTask分析(1.8)

    FutureTask简介 FutureTask用于异步计算,也就是支持异步执行并返回结果.FutureTask本身是一个Runable,所以可以交给Thread来运行,在提交给Thread运行后,可以 ...

  3. Sql函数简单使用

    ),)) ) as begin ) --如果@nameA 不为空则直接返回@nameA IF @nameA <>'' BEGIN set @lastNameVal = @nameA END ...

  4. JAVAEE学习笔记

    以后创建常量有三个名字:Constant   SystemParas   StaticValue 上限或者下限命名      max_    min_ 包含的范围命名     first      l ...

  5. 从Java虚拟机的内存区域、垃圾收集器及内存分配原则谈Java的内存回收机制

    一.引言: 在Java中我们只需要轻轻地new一下,就可以为实例化一个类,并分配对应的内存空间,而后似乎我们也可以不用去管它,Java自带垃圾回收器,到了对象死亡的时候垃圾回收器就会将死亡对象的内存回 ...

  6. spark streaming(2) DAG静态定义及DStream,DStreamGraph

    DAG 中文名有向无环图.它不是spark独有技术.它是一种编程思想 ,甚至于hadoop阵营里也有运用DAG的技术,比如Tez,Oozie.有意思的是,Tez是从MapReduce的基础上深化而来的 ...

  7. 如何简单的实现新手引导之UGUI篇

    一个完整的游戏项目肯定是要做新手引导的,而引导做的好坏可能会影响玩家的留存.那么怎么简单的实现个简有效的引导呢!先不说废话,先看看效果,这是一个基于UGUI做的一个简单的引导! 怎么样,看着是那么回事 ...

  8. 处理浏览器兼容 各个浏览器的标识 hack

    Firefox 浏览器 @-moz-document url-prefix() { .selector { property: value; } } 支持所有Gecko内核的浏览器 (包括Firefo ...

  9. winform .net2.0的程序如何运行于.net 4.x

    约束 最近有一个winform项目,要求: (1)程序能够运行在winxp, win7, win8, win10中 (2)安装尽可能简单,尽量不要安装.net framework.即使要安装也要尽可以 ...

  10. EF查询百万级数据的性能测试

    一.起因  个人还是比较喜欢EF的,毕竟不用写Sql,开发效率高,操作简单,不过总是听人说EF的性能不是很好,也看过别人做的测试,但是看了就以为真的是那样.但是实际上到底是怎么样,说实话我真的不知道. ...