基礎概念
Module
- 把相關的 Component、Directive、Pipe、Service 等打包在一起的容器
- Lazy Loading
Component
Pipe
- 用來轉換資料的工具,可以把字串格式化、日期格式化等
Directive
- 用來修改 DOM 元素的外觀或行為
- 比如說 ngIf、ngFor、ngStyle、ngClass
- 類型
- Structural Directive: 修改 DOM 的結構
- 可以搭配
ng-container
- 不會產生額外的 DOM 元素,可以用在想要用 ngIf 和 ngFor 但不想產生額外元素的情況
*ngFor
let item of items; index as i
- Attribute Directive: 修改 DOM 的屬性
- Component Directive: 包含 template 的 directive
Service
- 負責 API 請求、資料處理等工作
- Dependency Injection
- @Injectable
- providedIn
- root: 全域共用
- 也可以在 component 的 providers 中設定要注入的 service
Router
CLI Command
ng new my-app
: 建立新的 Angular 專案
ng serve
: 啟動開發伺服器
ng build
: 打包專案
- generate
ng generate module my-module
: 建立新的 Module
ng generate component my-component
: 建立新的 Component
--module=app
: 指定 Component 所屬的 Module
ng generate service my-service
: 建立新的 Service
ng generate pipe my-pipe
: 建立新的 Pipe
ng generate directive my-directive
: 建立新的 Directive
Module
- NgModule
- declarations: 定義同一 Module 中的 Component、Directive、Pipe
- imports: 匯入其他 Module
- providers: 定義 Service
- bootstrap: 定義啟動的 Component
- exports: 定義要匯出的 Component、Directive、Pipe
Component
- 包含元素
- Template
- TypeScript Class
- Selector: 定義 Component 的名稱
- CSS Style
- standalone
- 新版 Angular 預設 app 使用 Standalone 模式,使 component 不再需要透過 NgModule 管理
Lifecycle Hooks
- ngOnChanges
- ngOnInit
- 當 Angular 初始化指令/元件時調用
- 在第一輪 ngOnChanges 後調用
- 只調用一次
- 使用場景
- 初始化資料(需要根據 @Input 變數)
- fetch data from API
- ngDoCheck
- 在 ngOnChange 和 ngOnInit 之後調用
- ngAfterContentInit
- 在 Angular 把 ng-content 投影到 view 後調用
- 在第一個 ngDoCheck 之後調用
- ngAfterContentChecked
- ngAfterViewInit
- ngAfterViewChecked
- ngOnDestroy
- 在 Angular 銷毀 directive/component 前調用
Component check
- 操作
- update child component input binding
- update DOM interpolation
- update query list
Sharing Data
Binding
Property Binding
- 用來設定 HTML 元素的屬性
- 用中括號
[]
包住屬性名稱
- ex:
<img [src]="imageUrl">
Event Binding
- 用來設定 HTML 元素的事件
- 用小括號
()
包住事件名稱
- ex:
<button (click)="onClick()">
$event
: 可以取得事件物件
Two-way Binding
- 把屬性和事件綁定在一起
- 用中括號和小括號
[(ngModel)]
包住屬性名稱
- ex:
<input [(ngModel)]="name">