Angular bu hatayı, bir computed veya bir şablon değerlendirilirken bir sinyale (set veya update ile) yazıldığında fırlatır. Her ikisinin de yalnızca sinyalleri okuması beklenir, bu yüzden orada bir sinyale yazmak, durumu hesaplanmasının ortasında değiştirir.
Hata mesajı, bu iki durumdan hangisi olduğunu belirtir.
Bir computed içinde sinyallere yazmaya izin verilmez
Bir computed, değerini yan etki olmadan diğer sinyallerden türetmelidir:
count = signal(1);
total = signal(0);
doubled = computed(() => {
this.total.set(this.count() * 2); // izin verilmez
return this.count() * 2;
});
Değer yalnızca diğer sinyallere bağlıysa, onu saklamak yerine kendisini bir computed yapın:
Değerin aynı zamanda yazılabilir olması gerekiyorsa linkedSignal, yazma işlemi değişikliğin bir yan etkisiyse bir effect kullanın.
Aynı hata, bir linkedSignal'ın hesaplaması içindeki yazmalar için de fırlatılır.
Angular şablonu render ederken sinyallere yazmaya izin verilmez
Şablon ifadeleri render sırasında çalışır, bu yüzden şablondan çağrılan bir metot da bir sinyale yazmamalıdır:
@Component({
selector: 'app-example',
template: '<p>{{ label() }}</p>',
})
export class Example {
views = signal(0);
label() {
this.views.update((v) => v + 1); // izin verilmez
return `Viewed ${this.views()} times`;
}
}
Yazma işlemini, değişikliğin gerçekten gerçekleştiği yere taşıyın. Sinyallere yazmaya olay dinleyicilerinde, yaşam döngüsü kancalarında, output işleyicilerinde ve effect'lerde izin verilir.
untracked kullanma
untracked içine sarılmış bir yazma işlemi hata fırlatmaz. Bunu yalnızca yazma kasıtlı olduğunda ve taşınamadığında kullanın ve untracked içinde okunan sinyallerin de takip edilmediğini unutmayın.
Hatanın ayıklanması
Yığın izi (stack trace), set veya update çağrısını gösterir. Oradan, onu çağıran computed, linkedSignal veya şablon ifadesini arayın.