Vì signal phát tín hiệu thay đổi dựa trên so sánh tham chiếu khi bạn ghi giá trị mới. items().push(x) chỉ đọc signal rồi mutate mảng tại chỗ — signal không hề biết có gì thay đổi, nên không thông báo cho template.
ts
const items = signal<string[]>([])
items().push('a') // wrong: no notification, UI stays stale
items.set(['a']) // set: replace with a brand-new value
items.update(list => [...list, 'a']) // update: derive the new value from the oldset(value): gán giá trị mới không phụ thuộc giá trị cũ.update(fn): tính giá trị mới từ giá trị cũ — an toàn hơn khi cập nhật liên tiếp.- (
mutate()từng tồn tại trong bản developer preview nhưng đã bị gỡ; cách chính thức là tạo giá trị mới.)
Đọc signal bằng cách gọi như hàm (items()) vì đó chính là điểm Angular ghi nhận dependency: mọi computed/effect/template đọc signal đều được đăng ký để chạy lại khi giá trị đổi. Hệ quả: luôn coi dữ liệu trong signal là bất biến, cập nhật bằng cách tạo mảng/object mới.