Angular組件——父子組件通訊

来源:https://www.cnblogs.com/starof/archive/2018/03/24/8636579.html
-Advertisement-
Play Games

Angular組件間通訊 組件樹,1號是根組件AppComponent。 組件之間松耦合,組件之間知道的越少越好。 組件4裡面點擊按鈕,觸發組件5的初始化邏輯。 傳統做法:在按鈕4的點擊事件里調用組件5的方法。緊密耦合。 Angular:在組件4根本不知道組件5存在的情況下實現。 使用松耦合的方式在 ...


Angular組件間通訊

組件樹,1號是根組件AppComponent。

組件之間松耦合,組件之間知道的越少越好。

組件4裡面點擊按鈕,觸發組件5的初始化邏輯。

傳統做法:在按鈕4的點擊事件里調用組件5的方法。緊密耦合。

Angular:在組件4根本不知道組件5存在的情況下實現。

使用松耦合的方式在組件之間傳遞數據開發出高重用性的組件。

使用輸入輸出屬性在父子關係的組件之間傳遞數據。

一、輸入輸出屬性概述

組件設計成黑盒模型,用輸入屬性聲明從外部世界接收什麼東西。不需要知道這些東西從哪裡來來。

組件只需要知道當它需要的東西外部世界提供給它以後它應該怎麼做。

組件通過輸出屬性發射事件告訴外部世界可能感興趣的東西。至於事件發射給誰組件也不需要知道。

誰感興趣誰自己訂閱組件發射的事件。

二、輸入屬性

子組件定義了2個輸入屬性,被@Input()裝飾器裝飾的屬性。

  @Input()
  stockCode:string;
  @Input()
  amount:number;

父組件通過屬性綁定到子組件輸入屬性的方式把stock屬性綁定到子組件的stockCode屬性上。

<div>
  我是父組件
</div>
<div>
  <input type="text" [(ngModel)]="stock" placeholder="請輸入股票代碼">
  <app-order [stockCode]=stock [amount]="100"></app-order>
</div>

三、屬性綁定是單向的,從父組件到子組件 

 每隔3s重置子組件的stockCode的值為Apple。

export class OrderComponent implements OnInit {

  @Input()
  stockCode:string;
  @Input()
  amount:number;

  constructor() { 
    setInterval(()=>{
      this.stockCode='Apple'
    },3000)
  }

  ngOnInit() {
  }
}

當子組件的stockCode的值變為Apple的時候,父組件的stock的值並沒有改變。說明綁定是單向的,只能是父組件改變子組件,子組件屬性改變不會影響到父組件。

 

四,輸出屬性

Angular組件可以使用EventEmitter對象發射自定義事件,這些事件可以被其它組件處理。 EventEmitter是Rxjs中Subject類的一個子類,在響應式編程中,它既可以作為被觀察者,也可以作為觀察者。就是說EventEmitter對象即可以通過它的emit方法發射自定義事件,也可以通過subscribe方法來訂閱EventEmitter發射出來的事件流。

如何使用EventEmit從組件內部向外發射事件?

例子場景:報價組件

假設需要一個組件,可以連接到股票交易所,並且實時的顯示變動的股票價格,為了讓這個組件可以在不同的金融類的應用中重用,除了實時顯示股票價格,組件還應該將最新的股票價格發送到組件之外,這樣其它的組件就可以針對變動的股票價格執行相應的業務邏輯。

Note:將特定的數據結構用類或介面來明確定義是一個良好的習慣

1、先模擬一個實時變動的IBM的股票價格

export class PriceQuoteComponent implements OnInit {

  //不連接股票服務,用一個隨機數生成器模擬股票價格的變化,並將股票代碼和最新的價格顯示出來

  stockCode:string="IBM";
  price:number;

  constructor() {
    setInterval(()=>{
      let priceQuote:PriceQuote=new PriceQuote(this.stockCode,100*Math.random());
      this.price=priceQuote.lastPrice;
    },1000)
  }

  ngOnInit() {
  }

}


//封裝一個報價對象來封裝股票價格信息
//將特定的數據結構用類或介面來明確定義是一個良好的習慣
export class PriceQuote {
  constructor(public stockCode: string, //股票代碼
    public lastPrice: number //最新價格
  ) {
  }
}

2、把信息輸出出去,告訴組件外部,誰感興趣誰來訂閱

EventEmit後面的範型是要往出發射的事件的數據是什麼類型的。

import { Component, OnInit, EventEmitter, Output } from '@angular/core';

@Component({
  selector: 'app-price-quote',
  templateUrl: './price-quote.component.html',
  styleUrls: ['./price-quote.component.css']
})
export class PriceQuoteComponent implements OnInit {

  //不連接股票服務,用一個隨機數生成器模擬股票價格的變化,並將股票代碼和最新的價格顯示出來

  stockCode: string = "IBM";
  price: number;

  @Output() //發射事件需要寫上Output
  //EventEmitter需要一個範型
  lastPrice: EventEmitter<PriceQuote> = new EventEmitter();
  //

  constructor() {
    setInterval(() => {
      let priceQuote: PriceQuote = new PriceQuote(this.stockCode, 100 * Math.random());
      this.price = priceQuote.lastPrice;
      //用lastPrice emit一個值出去
      this.lastPrice.emit(priceQuote);
    }, 1000)
  }

  ngOnInit() {
  }

}
//封裝一個報價對象來封裝股票價格信息 //將特定的數據結構用類或介面來明確定義是一個良好的習慣 export class PriceQuote { constructor(public stockCode: string, //股票代碼 public lastPrice: number //最新價格 ) { } }

3、在父組件中接收報價信息並顯示

父組件模版中通過事件綁定的方式來捕獲並處理。 

export class AppComponent {
  stock = "";
  priceQuote: PriceQuote = new PriceQuote("", 0);

  //event的類型就是子組件emit的時候發射出來的數據的類型
  //父組件中通過event就可以拿到
  priceQuoteHandler(event:PriceQuote){
    this.priceQuote=event;
  }
}

模版

<!--預設情況下,事件名字就是output輸出屬性的名字-->
<app-price-quote (lastPrice)="priceQuoteHandler($event)"></app-price-quote>

<div>
  這是在報價組件外部<br/>
  股票代碼是{{priceQuote.stockCode}},
  股票價格是{{priceQuote.lastPrice | number:"2.0-2"}}
</div>

預設情況下,事件名字就是output輸出屬性的名字,可以改變事件名字,通過

  @Output("priceChange") //發射事件需要寫上Output
  //EventEmitter需要一個範型
  lastPrice: EventEmitter<PriceQuote> = new EventEmitter();

模版中也改為

<app-price-quote (priceChange)="priceQuoteHandler($event)"></app-price-quote>

總結:通過輸出屬性發射事件,並通過事件攜帶數據,在父組件模版中通過事件綁定的方式來捕獲並處理。 

 

如果兩個組件之間不存父子關係,如何以一種松耦合的方式來傳遞數據。此時需要使用中間人模式

 

本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載註明出處:http://www.cnblogs.com/starof/p/8636579.html 有問題歡迎與我討論,共同進步。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1,HTML語言不區分大小寫 頁頭標簽: <title> </titile> 標題標簽: <hn> </hn> 可以使用屬性 align 例如align="right" hn中的n取值越大,顯示的字越小。 格式排版標簽: <br> 換行 <hr> 網頁水平線標簽 屬性:<hr align='"cen ...
  • 對於小白,對命令行工具使用得很少,而在學習vuejs框架時,命令行工具必不可少,因此,我對一些不懂安裝vuejs環境的小白寫如下教程: 1.vuejs是前端框架,環境藉助於nodo.js,因此,我們先要安裝node.js的環境。 2.百度{node.js},下載最新版本的nodejs環境,安裝完畢打 ...
  • canvas 畫圖,能夠選中所畫的圖片並且能夠隨意移動圖片 ...
  • 概念: W3C標準是一系列標準的集合,本質是結構標準語言,我們使用的html,css都要遵循這個標準。萬維網聯盟W3C創建於1994年,是Web技術領域最具權威和影響力的國際中立性技術標準機構。它有效促進了web技術相互之間的相容。 為什麼要遵守W3C標準呢?對於我們開發者來說,我們是介於瀏覽器製造 ...
  • 在Angular應用開發中,組件可以說是隨處可見的。本篇文章將介紹幾種常見的組件通訊場景,也就是讓兩個或多個組件之間交互的方法。根據數據的傳遞方向,分為父組件向子組件傳遞、子組件向父組件傳遞及通過服務傳遞三種交互方法。 ...
  • 什麼是JavaScript JavaScript一種動態類型、弱類型、基於原型的客戶端腳本語言,用來給HTML網頁增加動態功能。(好吧,概念什麼最討厭了) 動態: 在運行時確定數據類型。變數使用之前不需要類型聲明,通常變數的類型是被賦值的那個值的類型。 弱類: 計算時可以不同類型之間對使用者透明地隱 ...
  • 定義對象: 二維對象數組: 多維數組: 任意類型數組: 泛型類: ...
  • TypeScript 是微軟開發的 JavaScript 的超集,TypeScript相容JavaScript,可以載入JavaScript代碼然後運行。TypeScript與JavaScript相比進步的地方 包括:加入註釋,讓編譯器理解所支持的對象和函數,編譯器會移除註釋,不會增加開銷;增加一個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...