Change detection trong Angular là gì, nói một cách đơn giản?
Đáp án mẫu
Change detection là cách Angular giữ cho màn hình luôn khớp với dữ liệu. Khi có thứ gì đó có thể đã thay đổi, Angular kiểm tra các binding trong template, như {{ name }} hoặc [disabled]="saving", so với giá trị trước đó, và chỉ cập nhật DOM ở chỗ giá trị khác đi.
Angular cần biết khi nào phải kiểm tra. Trước đây, thư viện zone.js vá các API của browser, nên sau một cú click, timer hay HTTP response Angular tự chạy kiểm tra. Ngày nay, signals cho Angular biết chính xác view nào đọc giá trị đã đổi, và app zoneless dựa vào đó thay vì zone.js.
Mặc định Angular kiểm tra toàn bộ cây component từ trên xuống. Với OnPush, component chỉ được kiểm tra khi:
- reference của một input thay đổi,
- một sự kiện xảy ra bên trong nó,
- một signal mà nó đọc thay đổi, hoặc
asyncpipe phát giá trị, - hoặc bạn gọi
markForCheck().
Bạn hiếm khi tự gọi change detection. Nó chạy giúp bạn sau các sự kiện và cập nhật signal.
Hãy hình dung nó là việc Angular đọc lại các binding sau khi có chuyện xảy ra.
Ý chính
- Angular so sánh binding trong template với giá trị trước và cập nhật DOM
- zone.js trước đây kích hoạt kiểm tra sau các sự kiện bất đồng bộ
- Signals và zoneless cho điểm kích hoạt chính xác
- OnPush giới hạn thời điểm component được kiểm tra
Câu hỏi nối tiếp thường gặp
- Chiến lược Default và OnPush khác nhau như thế nào?
Lỗi thường gặp
- Nghĩ rằng Angular render lại cả trang mỗi khi có thay đổi
- Gọi detectChanges thủ công để chữa triệu chứng thay vì tìm nguyên nhân