前言
承接上一篇文章,目前資料是存放於父元件的,但卻是子元件需要這份資料做輸出,那要如何將父元件的資料傳遞給子元件呢?
@input()
現在專案內發生的問題就是:
- 兩個子元件 ArticleHeader 與 ArticleBody 的 Template 內有使用到 item 變數
- 但是
item
變數並沒有被傳進來,它仍然存在於 ArticleList 內
- 但是
如何把 item
變數傳入這兩個子元件呢?
在子元件的 class 內加入 @input() 裝飾器
如同先前提到的,要將父元件的資料傳遞到子元件,必須透過屬性繫結的方式。
意味著子元件必須要有一個屬性可以承接,於是在這邊宣告屬性 item ,並且不賦予任何值。
1 | import { Component, OnInit } from '@angular/core'; |
但這麼做還不夠,因為目前這個 item 只隸屬於 ArticleHeader 元件,在預設的情況下 item
是無法被父元件透過屬性繫結注入資料的。
還必須加入 @input() 這個 declarator 裝飾器,並且匯入相依模組才可以使用。
而這個步驟同樣也有自動完成可以使用,因此修正後如下:
1 | import { Component, OnInit, Input } from '@angular/core'; |
我們必須也在 ArticleBody 的 class 進行相同的操作,就不贅述了。
而經過上述這些步驟可以發現原本的錯誤已經不見了。
原因是我們已經定義了 item
,但是這樣還不算完成,先看一下目前網頁的狀態。
可以看到目前是沒有資料傳進來的,還需要做一些處理。
透過屬性繫結傳入資料
回到 ArticleList 的 Template 內,並且對兩個子元件加入屬性繫結。
居然有支援自動完成,太神啦!
1 | <!-- Article START--> |
我們就完成了子元件的屬性繫結,中括號 [] 裡面的
item
是剛才在子元件內定義的屬性,而等號後面接的是要傳入的資料也就是區域變數item
。
來測試看看吧!
至此,我們就完成了一個功能模組的建立,並且這個功能模組內有三個元件,其中父元件為 ArticleList 與它的兩個子元件 ArticleHeader 、 ArticleBody 。
小結
Angular 應用程式的架構,就是把網頁變成一個個大大小小的元件,這是屬於元件化的架構。
在元件化的架構下只要能妥善規劃,在開發、維護、管理層面上複雜度可以大幅地降低。