AngularJS'de veri bağlama nasıl çalışır?
AngularJS` çerçevesinde veri bağlama nasıl çalışır?
Sitelerinde]1 teknik ayrıntıları bulamadım. Veriler görünümden modele yayıldığında nasıl çalıştığı az çok açık. Ancak AngularJS, setter ve getter'lar olmadan model özelliklerinin değişikliklerini nasıl takip ediyor?
Bu işi yapabilecek JavaScript izleyicileri olduğunu buldum. Ancak Internet Explorer 6 ve Internet Explorer 7'de desteklenmiyorlar. Peki AngularJS, örneğin aşağıdakileri değiştirdiğimi ve bu değişikliği bir görünüme yansıttığımı nasıl biliyor?
myobject.myproperty="new value";
1922
3
AngularJS değeri hatırlar ve önceki bir değerle karşılaştırır. Bu temel kirli kontroldür. Değerde bir değişiklik varsa, değişiklik olayını ateşler.
AngularJS olmayan bir dünyadan AngularJS dünyasına geçiş yaparken çağırdığınız
$apply()
yöntemi,$digest()
yöntemini çağırır. Özet, sadece eski bir kirli kontroldür. Tüm tarayıcılarda çalışır ve tamamen öngörülebilirdir.Kirli kontrol (AngularJS) ile değişiklik dinleyicilerini (KnockoutJS ve Backbone.js) karşılaştırmak için: Kirli kontrol basit ve hatta verimsiz görünse de (buna daha sonra değineceğim), anlamsal olarak her zaman doğru olduğu ortaya çıkarken, değişiklik dinleyicilerinin çok sayıda garip köşe durumu vardır ve anlamsal olarak daha doğru hale getirmek için bağımlılık izleme gibi şeylere ihtiyaç duyar. KnockoutJS bağımlılık takibi, AngularJS'nin sahip olmadığı bir sorun için akıllıca bir özelliktir.
Değişiklik dinleyicileriyle ilgili sorunlar:
Peki ya performans?
Bu nedenle, kirli kontrol verimsiz olduğu için yavaşmışız gibi görünebilir. Burada sadece teorik argümanlar yerine gerçek sayılara bakmamız gerekiyor, ancak önce bazı kısıtlamaları tanımlayalım.
İnsanlar:
Yavaş - 50 ms'den daha hızlı olan her şey insanlar tarafından algılanamaz ve bu nedenle "anlık" olarak kabul edilebilir.
Sınırlı - Tek bir sayfada bir insana yaklaşık 2000 parçadan fazla bilgi gösteremezsiniz. Bundan daha fazlası gerçekten kötü bir kullanıcı arayüzüdür ve insanlar bunu zaten işleyemez.
Yani asıl soru şu: Bir tarayıcıda 50 ms içinde kaç karşılaştırma yapabilirsiniz? Birçok faktör devreye girdiği için bu cevaplaması zor bir sorudur, ancak işte bir test örneği: 10.000 izleyici oluşturan http://jsperf.com/angularjs-digest/6. Modern bir tarayıcıda bu işlem 6 ms'nin biraz altında sürer. Internet Explorer 8]4 üzerinde yaklaşık 40 ms sürer. Gördüğünüz gibi, bugünlerde yavaş tarayıcılarda bile bu bir sorun değil. Bir uyarı var: Karşılaştırmaların zaman sınırına sığması için basit olması gerekiyor... Ne yazık ki AngularJS'ye yavaş bir karşılaştırma eklemek çok kolaydır, bu nedenle ne yaptığınızı bilmediğinizde yavaş uygulamalar oluşturmak kolaydır. Ancak, yavaş karşılaştırmaların hangileri olduğunu size gösterecek bir enstrümantasyon modülü sağlayarak bir cevabımız olmasını umuyoruz.
Video oyunları ve GPU'ların özellikle tutarlı olduğu için kirli kontrol yaklaşımını kullandığı ortaya çıktı. Monitör yenileme hızını (genellikle 50-60 Hz veya her 16,6-20 ms'de bir) aştıkları sürece, bunun üzerindeki herhangi bir performans israftır, bu nedenle FPS'yi yükseltmek yerine daha fazla şey çizmeniz daha iyidir.
Benim temel anlayışım bu. Yanlış da olabilir!
$watch
yöntemine aktarır.$apply
yöntemi tarafından sarılır.metodunun sonunda
$digestmetodu çağrılır ve şöyle devam eder saatlerin her birini gözden geçirir ve o zamandan beri değişip değişmediğini kontrol eder. son kez
$digest` çalıştırıldığında.Normal geliştirmede, HTML'deki veri bağlama sözdizimi AngularJS derleyicisine sizin için saatleri oluşturmasını söyler ve denetleyici yöntemleri zaten
$apply
içinde çalıştırılır. Yani uygulama geliştiricisi için her şey şeffaftır.Bunu bir süre ben de merak ettim. Ayarlayıcılar olmadan
AngularJS
$scope
nesnesindeki değişiklikleri nasıl fark eder? Onları yokluyor mu?Aslında yaptığı şey şudur: Modeli değiştirdiğiniz herhangi bir "normal" yer zaten
AngularJS
nin bağırsaklarından çağrılmıştır, bu nedenle kodunuz çalıştıktan sonra sizin için otomatik olarak$apply
çağırır. Diyelim ki kontrolcünüzün bir element üzerindeng-click
e bağlı bir metodu var. AngularJSbu yöntemin çağrılmasını sizin için birbirine bağladığından, uygun yerde bir
$applyyapma şansına sahiptir. Aynı şekilde, doğrudan görünümlerde görünen ifadeler için, bunlar
AngularJStarafından yürütülür, böylece
$apply` yapar.Belgeler
AngularJS
nin dışındaki kodlar için$apply
kodunu manuel olarak çağırmak gerektiğinden bahsederken, çalıştırıldığında çağrı yığınındaAngularJS
nin kendisinden kaynaklanmayan kodlardan bahsediyor.