Pertama, perhatikan bahwa pengecualian ini hanya akan dibuang ketika Anda menjalankan aplikasi Anda dalam mode dev (yang merupakan kasus default pada beta-0): Jika Anda menelepon enableProdMode()
saat bootstrap aplikasi, itu tidak akan dibuang ( lihat plunk yang diperbarui ).
Kedua, jangan lakukan itu karena pengecualian ini dilempar karena alasan yang baik: Singkatnya, ketika dalam mode dev, setiap putaran deteksi perubahan segera diikuti oleh putaran kedua yang memverifikasi bahwa tidak ada binding yang berubah sejak akhir yang pertama, karena ini akan menunjukkan bahwa perubahan disebabkan oleh perubahan deteksi itu sendiri.
Dalam plunk Anda, pengikatan {{message}}
diubah oleh panggilan Anda ke setMessage()
, yang terjadi di ngAfterViewInit
hook, yang terjadi sebagai bagian dari giliran deteksi perubahan awal. Itu sendiri tidak bermasalah - masalahnya adalah bahwa setMessage()
perubahan mengikat tetapi tidak memicu putaran baru deteksi perubahan, yang berarti bahwa perubahan ini tidak akan terdeteksi sampai beberapa putaran deteksi perubahan berikutnya dipicu di tempat lain.
The takeaway: Apa pun yang mengubah kebutuhan mengikat untuk memicu putaran deteksi perubahan saat itu terjadi.
Perbarui sebagai respons terhadap semua permintaan untuk contoh cara melakukan itu : Solusi @ Tycho berfungsi, seperti yang ditunjukkan tiga metode dalam jawaban yang ditunjukkan @MarkRajcok. Tapi sejujurnya, mereka semua merasa jelek dan salah bagi saya, seperti jenis peretasan yang biasa kami gunakan di ng1.
Yang pasti, ada sesekali keadaan di mana hacks ini tepat, tetapi jika Anda menggunakan mereka pada sesuatu yang lebih dari yang sangat dasar sesekali, itu pertanda bahwa Anda berjuang kerangka bukan sepenuhnya merangkul alam reaktif.
IMHO, yang lebih idiomatik, "Angular2 way" untuk mendekati ini adalah sesuatu di sepanjang baris: ( plunk )
@Component({
selector: 'my-app',
template: `<div>I'm {{message | async}} </div>`
})
export class App {
message:Subject<string> = new BehaviorSubject('loading :(');
ngAfterViewInit() {
this.message.next('all done loading :)')
}
}
ExpressionChangedAfterItHasBeenCheckedError
kesalahan menjelaskan perilakunya dengan sangat rinci.