深入指南
元件

元件選擇器

TIP: 本指南假設你已讀過基礎指南。如果你是 Angular 新手,請先讀該指南。

每個元件都會定義一個 CSS 選擇器,決定該元件的使用方式:

@Component({
  selector: 'profile-photo',
  ...
})
export class ProfilePhoto { }

你透過在_其他_元件的範本中建立相符的 HTML 元素來使用元件:

@Component({
  template: `
    <profile-photo />
    <button>Upload a new profile photo</button>`,
  ...,
})
export class UserProfile { }

Angular 會在編譯時期靜態比對選擇器。在執行時期更動 DOM,無論是透過 Angular 繫結還是 DOM API,都不會影響所渲染的元件。

一個元素恰好只能比對一個元件選擇器。如果有多個元件選擇器比對到同一個元素,Angular 會回報錯誤。

元件選擇器區分大小寫。

選擇器的類型

Angular 在元件選擇器中,支援基本 CSS 選擇器類型的一個有限子集:

選擇器類型 說明 範例
類型選擇器 依據元素的 HTML 標籤名稱或節點名稱來比對元素。 profile-photo
屬性選擇器 依據元素是否具有某個 HTML 屬性,並可選擇性地比對該屬性的精確值來比對元素。 [dropzone] [type="reset"]
類別選擇器 依據元素是否具有某個 CSS 類別來比對元素。 .menu-item

對於屬性值,Angular 支援使用等號(=)運算子比對精確的屬性值。Angular 不支援其他屬性值運算子。

Angular 元件選擇器不支援組合子,包括後代組合子或子組合子。

Angular 元件選擇器不支援指定命名空間。

:not 偽類別

Angular 支援 :not 偽類別。你可以將這個偽類別附加到任何其他選擇器之後,以縮小元件選擇器的比對範圍。例如,你可以定義一個 [dropzone] 屬性選擇器,並防止它比對到 textarea 元素:

@Component({
  selector: '[dropzone]:not(textarea)',
  ...
})
export class DropZone { }

Angular 不支援在元件選擇器中使用任何其他偽類別或偽元素。

組合選擇器

你可以透過串連多個選擇器來組合它們。例如,你可以比對指定了 type="reset" 的 <button> 元素:

@Component({
  selector: 'button[type="reset"]',
  ...
})
export class ResetButton { }

你也可以使用逗號分隔的清單來定義多個選擇器:

@Component({
  selector: 'drop-zone, [dropzone]',
  ...
})
export class DropZone { }

Angular 會為比對到清單中_任何_選擇器的每個元素建立一個元件。

如何選擇選擇器

絕大多數元件應使用自訂元素名稱作為其選擇器。所有自訂元素名稱都應包含連字號,如 HTML 規格所述。依預設,當 Angular 遇到不符合任何可用元件的自訂標籤名稱時,會回報錯誤,以防止因元件名稱打錯而產生的錯誤。

關於在 Angular 範本中使用原生自訂元素的詳情,請參閱進階元件設定。

選擇器前綴

Angular 團隊建議為專案內定義的所有自訂元件,使用簡短且一致的前綴。例如,如果你要用 Angular 打造 YouTube,你可能會為元件加上 yt- 前綴,像是 yt-menu、yt-player 等元件。像這樣為選擇器加上命名空間,能讓人一眼就看出特定元件的來源。依預設,Angular CLI 使用 app-。

IMPORTANT: Angular 將 ng 選擇器前綴保留給它自己的框架 API。切勿將 ng 作為你自己自訂元件的選擇器前綴。

何時使用屬性選擇器

當你想在標準原生元素上建立元件時,應考慮使用屬性選擇器。例如,如果你想建立一個自訂按鈕元件,你可以利用標準的 <button> 元素,使用屬性選擇器:

@Component({
  selector: 'button[yt-upload]',
   ...
})
export class YouTubeUploadButton { }

這種做法可讓元件的使用者直接使用該元素的所有標準 API,無需額外工作。這對 aria-label 等 ARIA 屬性特別有價值。

當 Angular 遇到不符合任何可用元件的自訂屬性時,不會回報錯誤。使用具有屬性選擇器的元件時,使用者可能忘記匯入該元件或其 NgModule,導致元件無法渲染。更多資訊請參閱匯入與使用元件。

定義屬性選擇器的元件,應使用小寫、以連字號分隔(dash-case)的屬性。你可以遵循上面說明的相同前綴建議。