effect()
將一個變數設置成 signal() 之後,Angular 會自動追蹤它的變化,並在 UI 中反映這些變動。然而,在 TypeScript 程式碼中,單純使用 signal() 只會獲取當下的值,而不會設置自動監聽。
比如以下這個情境,constructor 中的 console.log 只會執行一次並顯示初始值 'online':
currentStatus = signal<'online' | 'offline' | 'unknown'>('online');
constructor() {
console.log(this.currentStatus()); // 只會在元件建立時執行一次
}
ngOnInit(): void {
const intervalId = setInterval(() => {
const rnd = Math.random(); // 0 ~ 0.99999
if (rnd < 0.5) {
this.currentStatus.set('online');
} else if (rnd < 0.9) {
this.currentStatus.set('offline');
} else {
this.currentStatus.set('unknown');
}
}, 3000);
this.destroyRef.onDestroy(() => {
clearInterval(intervalId);
});
}
如果想在 TypeScript 中監聽 signal 的變化,要使用 effect(() => {})
函式:
constructor() {
effect(() => {
console.log(this.currentStatus());
});
}
effect
接收一個函式作為參數,Angular 會自動追蹤這個函式內使用的所有 signals,並在任何一個 signal 變化時重新執行這個函式。在上面的例子中,每當 currentStatus
的值改變時,effect
內的函式就會重新執行,印出最新的狀態值。
Last updated