亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Angular中的組件通訊和依賴注入

發布時間:2021-09-24 09:52:17 來源:億速云 閱讀:176 作者:柒染 欄目:web開發

這篇文章給大家介紹如何理解Angular中的組件通訊和依賴注入,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Angular組件間怎么進行通訊?依賴注入是什么?

1.  組件通訊

1.1  向組件內部傳遞數據

<app-favorite [isFavorite]="true"></app-favorite>
// favorite.component.ts
import { Input } from '@angular/core';

export class FavoriteComponent {
    @Input() isFavorite: boolean = false;
}

注意:在屬性的外面加 [] 表示綁定動態值,在組件內接收后是布爾類型,不加 [] 表示綁定普通值,在組件內接收后是字符串類型。【相關教程推薦:《angular教程》】

1.2  組件向外部傳遞數據

需求:在子組件中通過點擊按鈕將數據傳遞給父組件

<!-- 子組件模板 -->
<button (click)="onClick()">click</button>
// 子組件類
import { EventEmitter, Output } from "@angular/core"

export class FavoriteComponent {
  @Output() change = new EventEmitter()
  onClick() {
    this.change.emit({ name: "張三" })
  }
}
<!-- 父組件模板 -->
<app-favorite (change)="onChange($event)"></app-favorite>
// 父組件類
export class AppComponent {
  onChange(event: { name: string }) {
    console.log(event)
  }
}

2.   依賴注入

2.1  概述

依賴注入 ( Dependency Injection ) 簡稱DI,是面向對象編程中的一種設計原則,用來減少代碼之間的耦合度

class MailService {
  constructor(APIKEY) {}
}

class EmailSender {
  mailService: MailService
  constructor() {
    this.mailService = new MailService("APIKEY1234567890")
  }

  sendMail(mail) {
    this.mailService.sendMail(mail)
  }
}

const emailSender = new EmailSender()
emailSender.sendMail(mail)

EmailSender 類運行時要使用 MailService 類,EmailSender 類依賴 MailService 類,MailService 類是 EmailSender 類的依賴項。

以上寫法的耦合度太高,代碼并不健壯。如果 MailService 類改變了參數的傳遞方式,在 EmailSender 類中的寫法也要跟著改變

class EmailSender {
  mailService: MailService
  constructor(mailService: MailService) {
    this.mailService = mailService;
  }
}
const mailService = new MailService("APIKEY1234567890")
const emailSender = new EmailSender(mailService)

在實例化 EmailSender 類時將它的依賴項通過 constructor 構造函數參數的形式注入到類的內部,這種寫法就是依賴注入。

通過依賴注入降了代碼之間的耦合度,增加了代碼的可維護性。MailService 類中代碼的更改再也不會影響 EmailSender

2.2  DI 框架

Angular 有自己的 DI 框架,它將實現依賴注入的過程隱藏了,對于開發者來說只需使用很簡單的代碼就可以使用復雜的依賴注入功能。

AngularDI 框架中有四個核心概念:

  • Dependency:組件要依賴的實例對象,服務實例對象

  • Token:獲取服務實例對象的標識

  • Injector:注入器,負責創建維護服務類的實例對象并向組件中注入服務實例對象。

  • Provider:配置注入器的對象,指定創建服務實例對象的服務類和獲取實例對象的標識。

2.2.1  注入器 Injectors

注入器負責創建服務類實例對象,并將服務類實例對象注入到需要的組件中

  • 創建注入器

    import { ReflectiveInjector } from "@angular/core"
    // 服務類
    class MailService {}
    // 創建注入器并傳入服務類
    const injector = ReflectiveInjector.resolveAndCreate([MailService])
  • 獲取注入器中的服務類實例對象

    const mailService = injector.get(MailService)
  • 服務實例對象為單例模式,注入器在創建服務實例后會對其進行緩存

    const mailService1 = injector.get(MailService)
    const mailService2 = injector.get(MailService)
    
    console.log(mailService1 === mailService2) // true
  • 不同的注入器返回不同的服務實例對象

    const injector = ReflectiveInjector.resolveAndCreate([MailService])
    const childInjector = injector.resolveAndCreateChild([MailService])
    
    const mailService1 = injector.get(MailService)
    const mailService2 = childInjector.get(MailService)
    
    console.log(mailService1 === mailService2) // false
  • 服務實例的查找類似函數作用域鏈,當前級別可以找到就使用當前級別,當前級別找不到去父級中查找

    const injector = ReflectiveInjector.resolveAndCreate([MailService])
    const childInjector = injector.resolveAndCreateChild([])
    
    const mailService1 = injector.get(MailService)
    const mailService2 = childInjector.get(MailService)
    
    console.log(mailService1 === mailService2) // true

2.2.2  提供者 Provider

  • 配置注入器的對象,指定了創建實例對象的服務類和訪問服務實例對象的標識

    const injector = ReflectiveInjector.resolveAndCreate([
      { provide: MailService, useClass: MailService }
    ])
  • 訪問依賴對象的標識也可以是字符串類型

    const injector = ReflectiveInjector.resolveAndCreate([
      { provide: "mail", useClass: MailService }
    ])
    const mailService = injector.get("mail")
  • useValue

    const injector = ReflectiveInjector.resolveAndCreate([
      {
        provide: "Config",
        useValue: Object.freeze({
          APIKEY: "API1234567890",
          APISCRET: "500-400-300"
        })
      }
    ])
    const Config = injector.get("Config")

將實例對象和外部的引用建立了松耦合關系,外部通過標識獲取實例對象,只要標識保持不變,內部代碼怎么變都不會影響到外部

關于如何理解Angular中的組件通訊和依賴注入就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

呼伦贝尔市| 巢湖市| 和林格尔县| 孝义市| 临清市| 普兰店市| 宁强县| 襄樊市| 会同县| 明水县| 名山县| 太白县| 朔州市| 平安县| 德兴市| 高阳县| 宜宾县| 卓尼县| 惠安县| 湘阴县| 邻水| 县级市| 黑龙江省| 安庆市| 黔西| 浦东新区| 镇坪县| 盐源县| 句容市| 定兴县| 镇远县| 南昌市| 宝鸡市| 玉环县| 嵩明县| 漳浦县| 沙坪坝区| 安庆市| 若尔盖县| 本溪| 南平市|