iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > 其他 >手把手带你了解Angular中的依赖注入
  • 392
分享到

手把手带你了解Angular中的依赖注入

Angular.jsAngular依赖注入 2023-05-14 21:05:47 392人浏览 薄情痞子
摘要

本篇文章带大家了解一下依赖注入,介绍一下依赖注入解决的问题和它原生的写法是什么,并聊聊angular的依赖注入框架,希望对大家有所帮助!最近在Angular项目中经常能碰到依赖注入这个关键词,但是始终不理解它是怎么实现的,在Angular的

本篇文章带大家了解一下依赖注入,介绍一下依赖注入解决的问题和它原生的写法是什么,并聊聊angular的依赖注入框架,希望对大家有所帮助!

手把手带你了解Angular中的依赖注入

最近在Angular项目中经常能碰到依赖注入这个关键词,但是始终不理解它是怎么实现的,在Angular的官网上也只有关于它的使用,详细点的原理并没有说明,所以就下来我们就从原生的写法来讲解一下,依赖注入是用来解决什么问题的,他用js应该怎么去表现。【相关教程推荐:《angular教程》】

依赖注入是什么

依赖注入简称DI,是面向对象编程中的一种设计原则,用来减少代码之间的耦合度。

我们先来看一段代码

class Video{
    constructor(url){}
}

class Note{
    video: Video
    constructor(){
        this.video = new Video("https://aaaaa.mp4")
    }
    
    getScreenshot(){
        this.video.getScreenshot()
    }
}

const note = new Note()
note.getScreenshot()

假设我们用一个视频类,它其中有一个方法 getScreenshot 获取截图,在实例化视频类的时候,需要传入一个视频 url 这样的参数。现在有一个笔记类,它需要去调用视频类下的截图方法,那么我们就可以说,笔记类是依赖于视频类的。所以在笔记类的内部,我们就需要去实例化视频类,这样才能在笔记类中获取视频类的实例对象,并且调用它里面的截图方法。

上面代码的耦合度过高,并不推荐使用,比方说如果Video的视频地址换了一个,那么在Note中就需要去改变传入的视频url,这样假设要是有更多的类依赖于视频类,那么一旦做出更改,那么所有地方都要跟着改变,非常的不方便。

接下来利用依赖注入解决上面的问题:

class Note{
    video: Video
    constructor(video: Video){
        this.video = Video;
    }
}

const video = new Video("Https://aaaaa.mp4")
const note = new Note(video)

我们在类的外部去实例化视频类,并且通过参数传递的方式把实例传递给了笔记类,通过这样的方式就能够成功解决耦合度过高的问题,我们把通过参数传递实例的这种方式称为:注入。

优点

通过依赖注入降低了代码之间的耦合度,增加了代码的可维护性。视频类中的代码更改也不会去影响到笔记类了。

Angular的DI框架

在上述实现的过程当中,还是有着一个不是特别理想的地方,就是我们需要在类的外部去实例化视频类,虽然只有这一处,但是我们还是希望视频类的内部再怎么更改,都不会影响外部代码。

在 Angular 提供的 DI 框架中,我们就不需要自己去做视频类的实例化操作,它将实现依赖注入的过程隐藏了,对于开发者来说,只需要使用很简单的代码就可以使用复杂的依赖注入功能。

在 Angular 的 DI 有四个核心的概念:

  • Dependency:组件要依赖的实例对象,服务实例对象

  • Token:获取服务实例对象的标识,在Angular会维护很多的实例对象,在我们需要获取的时候,就需要通过标识去获取

  • Injector:注入器,负责创建维护服务类的实例对象,并向组件中注入服务实例对象,通过参数的方式传递给各个组件

  • Procider:对象,用于配置注入器,指定创建服务实例对象的服务类和获取实例对象的标识

Injector注入器

我们先通过Angular提供的基本语法来创建一个注入器

1、创建注入器

import { ReflectiveInjector } from "@angular/core"
//服务类
class Video{}
//创建注入器并传入服务类
const injector = ReflectiveInjector.resolveAndCreate([ Video ])

引入ReflectiveInjector其中resolveAndCreate方法用于创建注入器,它接收一个数组,数组中就是需要创建实例对象的类,这个方法会返回一个注入器 2. 获取注入器中的服务类实例对象

const video = injector.get(Video)

在injector下有一个get方法,用于传入标识并且获取实例对象,默认标识就是服务类的名称也就是Video

这样我们就能够获取到Video的实例对象了,Angular给我们提供的这套DI框架使得我们不需要去手动的实例化某一个类来获得它的实例对象,它会来帮我们完成。

2、服务的实例对象为单例模式,注入器在创建服务实例后悔对其进行缓存

const video1 = injector.get(Video)
const video2 = injector.get(Video)

console.log(video1 === video1)//true

也就是说,无论通过框架获取多少次实例对象,他返回的都是同一个实例对象

3、但是我们可以通过创建多个注入器,不同的注入器返回的同一个服务实例化的对象不是同一个

const injector1 = ReflectiveInjector.resolveAndCreate([ Video ])
const injector2 = ReflectiveInjector.resolveAndCreate([ Video ])

const video1 = injector1.get(Video)
const video2 = injector2.get(Video)

console.log(video1 === video1)//false

4、注入器上面存在一个创建子级注入器的方法为 resolveAndCreateChild,这个方法会创建一个子级注入器,父级注入器和子级注入器之间的关系类似于js的作用域链,当前注入器查找不到就会去父级注入器查找,比如:

const injector = ReflectiveInjector.resolveAndCreate([ Video ])
const injectorChild = injector.resolveAndCreateChild([])

const video1 = injector.get(Video)
const video2 = injectorChild.get(Video)

console.log(video1 === video1)//true

像上面这段代码,我们在创建子级注入器的时候,不传递参数,但是在子级注入器实例化的时候,由于自身不存在 Video 这个服务,它就会去父级查找,当然,就找到了父级的 Video 这个服务并且实例化,所以后面的两个实例化对象相等

总结

本文介绍了依赖注入解决的问题和它原生的写法是什么用的,并且介绍了Angular提供给我们的DI框架,用它提供给我们的简单api实现了实例化的过程,并且讲解了注入器,也是会分层级的,能提供给我们更好地一个项目设计方式。之后有机会再来讲解一下provider以及更多的扩展。

以上就是手把手带你了解Angular中的依赖注入的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 手把手带你了解Angular中的依赖注入

本文链接: https://www.lsjlt.com/news/205763.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 小程序速报[No.90] | 小程序最新资讯,错过还要等2周
    ⭐本期内容速览:1、平台支付手续费调整通知2、关于canvas v2 保存图片的实现3、小程序变现锦囊:交易解决方案上线,新能力助力好生意4、交易类目限制订单金额及账期调整通知5、助力留资转化率,留资组件内测开启6、官方小程序上线,提升经营...
    99+
    2024-05-15
    头条 抖音 小程序 更新
  • 代码级质量技术之基本框架介绍
    一、背景代码级质量技术:顾名思义为了服务质量更好,涉及到代码层面的相关技术,特别要指出的是,代码级质量技术不单纯指代码召回技术,如静态代码扫描、单元测试等。研究代码级质量技术主要有以下几个方面的原因:1、随着精准测试等概念的兴起,对代码覆盖...
    99+
    2024-05-15
    代码级质量 框架
  • jquery清除同级div
    随着Web应用不断复杂,JavaScript框架变得越来越重要。其中最受欢迎的框架之一是jQuery,jQuery是一个流行的JavaScript库,它可以使处理文档元素、处理事件和创建特效更加容易。在这篇文章中,我们将学习如何使用jQue...
    99+
    2024-05-15
  • jquery 查询筛选
    JQuery是一款非常优秀的JavaScript库,提供了许多便捷的方法使得前端开发变得更加快捷高效。在JQuery中,查询筛选是其最常用的功能之一,本文将详细介绍JQuery查询筛选的相关部分。一、概述JQuery的查询筛选机制是其最重要...
    99+
    2024-05-15
  • jquery 图片无法显示
    在网页开发过程中,经常会用到图片来丰富页面内容,但有时会出现图片无法显示的情况,这个问题通常与文件路径或文件名有关。本文将介绍使用 jQuery 快速解决图片无法显示的问题。一、确认图片文件路径最常见的原因是图片文件路径错误或者图片文件不存...
    99+
    2024-05-15
  • jquery移除只读
    在使用HTML表单时,经常需要将一些输入框设置为只读状态,以防止用户对这些信息进行修改。但有时候需要在特定情况下,将这些输入框的只读属性移除,以便用户可以进行修改或编辑。这时候就需要使用jQuery来移除只读属性。jQuery是一种Java...
    99+
    2024-05-15
  • vue选择地址怎么做
    Vue是一种流行的JavaScript框架,用于构建交互式Web应用程序。在许多Web应用程序中,选择地址是常见的功能需求。本文将介绍如何使用Vue实现选择地址,包括如何使用第三方库和如何自定义Vue组件。一、使用第三方库一个常见的选择地址...
    99+
    2024-05-15
  • VUe双中括号属性如何使用
    Vue是一种流行的JavaScript框架,它使用双花括号(“{{”和“}}”)语法来实现属性与视图之间的数据绑定。VUe框架中的模板显示了被框架监控的变量的特定属性,当这些变量的值改变时,这些属性也跟随改变,从而在视图中自动更新相应的值。...
    99+
    2024-05-15
  • vue refs 方法参数
    随着前端技术的不断发展,Vue框架毫无疑问成为了前端框架中最受欢迎的一种。Vue组件的复杂性也越来越高,因此,Vue框架提供了许多API来使得开发更加灵活和高效。其中之一就是refs方法。refs 方法用于在Vue中访问组件的实例或元素。这...
    99+
    2024-05-15
  • vue.js函数求和
    Vue.js是一个流行的JavaScript框架,它使得前端开发变得更容易和更快速。在Vue.js中,我们可以通过函数来实现对数据的操作,并实现一些加减乘除等简单的数学计算。本文将介绍如何使用Vue.js实现一个函数求和功能。首先,我们需要...
    99+
    2024-05-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作