Dokümanlar'dan:
scanChanges (): void
Değişim dedektörünü ve çocuklarını kontrol eder.
Bu, modelinizdeki (sınıfınız) herhangi bir şeyin değiştiği ancak görünümü yansıtmadığı bir durum varsa, bu değişiklikleri tespit etmek (yerel değişiklikleri tespit etmek) ve görünümü güncellemek için Angular'a bildirmeniz gerekebilir.
Olası senaryolar şunlar olabilir:
1- değişikliği detektörü görünümü ayrılır (bkz ayırmak )
2- Bir güncelleme oldu, ancak Açısal Bölge içinde değildi, bu nedenle Angular bunu bilmiyor.
Üçüncü taraf bir işlev modelinizi güncellediğinde ve bundan sonra görünümü güncellemek istediğinizde olduğu gibi.
someFunctionThatIsRunByAThirdPartyCode(){
yourModel.text = "new text";
}
Bu kod Angular'ın bölgesi (muhtemelen) dışında olduğundan, büyük olasılıkla değişiklikleri algıladığınızdan ve görünümü güncellediğinizden emin olmanız gerekir:
myFunction(){
someFunctionThatIsRunByAThirdPartyCode();
// Let's detect the changes that above function made to the model which Angular is not aware of.
this.cd.detectChanges();
}
NOT :
Yukarıda çalışmanın başka yolları da vardır, başka bir deyişle, bu değişikliği Açısal değişim döngüsüne getirmenin başka yolları da vardır.
** Üçüncü taraf işlevini bir bölge içine koyabilirsiniz. Run:
myFunction(){
this.zone.run(this.someFunctionThatIsRunByAThirdPartyCode);
}
** İşlevi bir setTimeout içine sarabilirsiniz:
myFunction(){
setTimeout(this.someFunctionThatIsRunByAThirdPartyCode,0);
}
3- Modeli change detection cycle
bitirdikten sonra güncellediğiniz durumlar da vardır, bu durumlarda bu korkunç hatayı alırsınız:
"İfade kontrol edildikten sonra değişti";
Bu genellikle (Angular2 dilinden) şu anlama gelir:
Modelinizde, kabul edilen yöntemlerimden (etkinlikler, XHR istekleri, setTimeout ve ...) kaynaklanan bir değişiklik gördüm ve ardından görünümünüzü güncellemek için değişiklik algılamamı çalıştırdım ve bitirdim, ancak sonra başka bir şey vardı kodunuzda modeli tekrar güncelledi ve artık değişiklik algılamamı tekrar çalıştırmak istemiyorum çünkü AngularJS gibi kirli kontroller yok: D ve tek yönlü veri akışı kullanmalıyız!
Kesinlikle bu hatayla karşılaşacaksınız: P.
Bunu düzeltmenin birkaç yolu:
1- Doğru yol : güncellemenin değişiklik algılama döngüsünün içinde olduğundan emin olun (Açısal2 güncellemeleri bir kez gerçekleşen tek yönlü akıştır, bundan sonra modeli güncellemeyin ve kodunuzu daha iyi bir yere / saate taşıyın).
2- Tembel yol : açısal2'yi mutlu etmek için bu güncellemeden sonra detChanges () 'i çalıştırın, bu kesinlikle en iyi yol değildir, ancak olası senaryoların ne olduğunu sorduğunuzda, bunlardan biri budur.
Bu şekilde söylüyorsunuz: Değişiklik tespiti yaptığınızı içtenlikle biliyorum, ama tekrar yapmanızı istiyorum çünkü kontrolü bitirdikten sonra anında bir şeyler güncellemem gerekti.
3- Kodu a içine koyun setTimeout
, çünkü setTimeout
bölgeye göre yamalı ve detectChanges
bittikten sonra çalışacaktır .
Dokümanlardan
markForCheck() : void
Tüm ChangeDetectionStrategy atalarını kontrol edilecek şekilde işaretler.
Bu çoğunlukla bileşeninizin ChangeDetectionStrategy öğesi OnPush olduğunda gereklidir .
OnPush'ın kendisi, değişiklik algılamasını yalnızca bunlardan biri gerçekleştiğinde çalıştırın:
1- Bileşenin @input'larından biri tamamen yeni bir değerle değiştirildi veya @Input özelliğinin başvurusu tamamen değiştiyse basitçe ifade edildi.
Yani eğer ChangeDetectionStrategy sizin bileşeninin olduğunu OnPush sonra ve sahip:
var obj = {
name:'Milad'
};
Ve sonra günceller / değiştirirsiniz:
obj.name = "a new name";
Bu obj referansını güncellemeyecektir , bu nedenle değişiklik tespiti çalışmaz, bu nedenle görünüm güncellemeyi / mutasyonu yansıtmaz.
Bu durumda, Angular'a görünümü kontrol etmesini ve güncellemesini manuel olarak söylemeniz gerekir (markForCheck);
Eğer bunu yaptıysanız:
obj.name = "a new name";
Bunu yapmanız gerekir:
this.cd.markForCheck();
Aksine, aşağıda bir değişiklik algılamasının çalışmasına neden olur:
obj = {
name:"a new name"
};
Hangi önceki obj tamamen yeni bir yerine {}
;
2- Bir olay, bir tıklama gibi veya böyle bir şey tetiklendi veya alt bileşenlerden herhangi biri bir olay yayınladı.
Gibi etkinlikler:
- Tıklayın
- keyup
- Abonelik etkinlikleri
- vb.
Kısacası:
Kullanım detectChanges()
Eğer açısal sonra modelimizi güncelledik 's değişim algılama tükendi veya güncelleme hiç açısal dünyada olmadıysa.
Kullanım markForCheck()
sen OnPush kullanıyor ve atlayarak eğer ChangeDetectionStrategy
bazı verileri mutasyona uğratarak veya bir iç modelimizi güncelledik setTimeout ;