Ne zaman ng-if / ng-show / ng-hide tercih edilir?


Yanıtlar:


703

Kullanım durumunuza bağlıdır, ancak farkı özetlemek gerekirse:

  1. ng-ifDOM'dan öğeleri kaldıracak. Bu, tüm işleyicilerinizin veya bu öğelere eklenmiş olan herhangi bir şeyin kaybolacağı anlamına gelir. Örneğin, bir tıklama işleyicisini alt öğelerden birine ng-ifbağlarsanız, false olarak değerlendirildiğinde, bu öğe DOM'dan kaldırılır ve tıklama işleyiciniz daha sonra ng-iftrue olarak değerlendirildikten ve öğeyi görüntüledikten sonra bile çalışmayacaktır . İşleyiciyi yeniden takmanız gerekecektir.
  2. ng-show/ng-hideöğeleri DOM'dan kaldırmaz. Öğeleri gizlemek / göstermek için CSS stillerini kullanır (not: kendi sınıflarınızı eklemeniz gerekebilir). Bu şekilde çocuklara bağlı olan işleyicileriniz kaybolmaz.
  3. ng-ifiken bir çocuk kapsamını oluşturur ng-show/ng-hidedeğil

DOM'da bulunmayan öğelerin daha az performans etkisi vardır ve web uygulamanız, kullanırken ng-ifkarşılaştırıldığında daha hızlı görünebilir ng-show/ng-hide. Deneyimlerime göre, fark göz ardı edilebilir. Animasyonlar her ikisini de kullanırken ng-show/ng-hideve ng-ifher ikisi için de Açısal belgelerdeki örneklerle mümkündür .

Sonuç olarak, cevaplamanız gereken soru, öğeyi DOM'dan silip edemeyeceğinizdir?


19
İle CSS3 animasyonlarını kullanabilirsiniz ng-if. Animasyonlar paragrafını ve dokümanlardaki örneği kontrol edin . Ayrıca gizli elemanlar da sayılacağı ng-hide/ng-showiçin css seçicileri gibi :first-childveya :nth-childdüzgün çalışmaz.
asukasz Wojciechowski

4
Animasyon hizmeti açısal.dart içinde nispeten yeni. Bunu yazarken mevcut değildi.
markovuksanovic

44
İşleyicileri bağlamak için gerektiği gibi yönergeler (ng-click gibi) kullanıyorsanız ilk nokta sorun değil.
Kevin

9
Ayrıca, ng-ifyeni bir kapsam oluşturur ng-showancak oluşturmaz.
martin

8
Ayrıca, DOM'ye öğe eklemenin ve kaldırmanın, sık sık yapılması durumunda yüksek performans maliyetine neden olabileceğinden de bahsetmek gerekir.
Kevin C.

130

Ng-if / ng-show'un nasıl çalıştığındaki farkı DOM-wise gösteren bir CodePen için buraya bakın .

@markovuksanovic soruyu iyi yanıtladı. Ama başka bir perspektiften gelecektim: Bu unsurları her zaman kullanırım ng-ifve DOM'dan çıkarırım, yoksa:

  1. bazı nedenlerden dolayı $watch, görünmez durumdayken öğelerinizdeki veri bağları ve -es öğelerinin etkin kalması gerekir. Tüm formun geçerli olup olmadığını belirlemek için, halihazırda görünmeyen girdilerin geçerliliğini kontrol etmek istiyorsanız formlar bunun için iyi bir durum olabilir.
  2. Yukarıda belirtildiği gibi koşullu olay işleyicileri ile gerçekten ayrıntılı durum bilgisi içeren bir mantık kullanıyorsunuz. Bununla birlikte , ng-if kullandığınızda önemli durumunuzu kaybedecek şekilde işleyicileri kendiniz elle bağlarken ve çıkarırsanız, bu durumun bir veri modelinde daha iyi temsil edilip edilmeyeceğini kendinize sorun ve işleyiciler her zaman yönergelerle koşullu olarak uygulanır öğe oluşturulur. Başka bir deyişle, işleyicilerin varlığı / yokluğu bir tür durum verisidir. Bu verileri DOM'dan bir modele çıkarın. İşleyicilerin varlığı / yokluğu veriler tarafından belirlenmeli ve böylece yeniden oluşturulması kolay olmalıdır.

Açısal gerçekten iyi yazılmış. Ne yaptığını düşünerek hızlı. Ancak yaptığı, zor şeyleri (2 yönlü veri bağlama gibi) önemsiz bir şekilde kolaylaştıran bir sürü sihir. Tüm bu şeylerin kolay görünmesi bazı performans yüklerini gerektirir. Bir setter fonksiyonunun $digest, hiç kimsenin bakmadığı bir DOM yığınında döngü sırasında yüzlerce veya binlerce kez değerlendirildiğini fark etmek şok olabilir . Ve sonra hepsi aynı şeyi yapan onlarca veya yüzlerce görünmez öğeye sahip olduğunuzu anlıyorsunuz ...

Masaüstü bilgisayarlar çoğu JS yürütme hızı sorununu tartışacak kadar güçlü olabilir. Ancak mobil cihazlar için geliştiriyorsanız, insanca mümkün olduğunda ng-if kullanmanın bir beyinsiz olması gerekir. JS hızı mobil işlemciler için hala önemlidir. Ng-if kullanmak, çok, çok düşük maliyetle potansiyel olarak önemli bir optimizasyon elde etmenin çok kolay bir yoludur.


6
Yukarıdaki cevaba çok güzel bir ek. Bazı iyi bağlam ile verilen, bu da karar vermede yardımcı olur. Teşekkürler.
Sean

1
ng-showvarsa, her birinin oluşturulması zaman alan çok fazla içeriğe sahip sekmeler varsa yararlı olabilir. İlk oluşturma işleminden sonra, sekmeler arasında hareket etmek anında gerçekleşecek, buna karşılık ng-ifyeniden oluşturma, bağlama olayları vb. Gerektirecektir. Açısal umutsuzca ihtiyacıng-ifshowwatch
poshest

53

Deneyimlerimden:

1) Sayfanızda bir şeyi göstermek / gizlemek için ng-if / ng-show kullanan bir geçiş varsa, ng-if daha fazla tarayıcı gecikmesine neden olur (daha yavaş). Örneğin: iki görünüm arasında geçiş yapmak için kullanılan bir düğmeniz varsa ng-show daha hızlı görünür.

2) ng-if, true / false olarak değerlendirildiğinde kapsam oluşturur / yok eder. Ng-if'ye bağlı bir denetleyiciniz varsa, ng-if her doğru olarak değerlendirildiğinde bu denetleyici kodu yürütülür. Ng-show kullanıyorsanız, denetleyici kodu yalnızca bir kez yürütülür. Bu nedenle, birden çok görünüm arasında geçiş yapan bir düğmeniz varsa, ng-if ve ng-show'u kullanmak, denetleyici kodunuzu yazma yönteminizde büyük bir fark yaratır.


5
Bu büyük bir gerçek! ng-if mutlaka ön ucunuzu daha hızlı yapmaz. Bu sizin ihtiyaçlarınıza bağlıdır. Aslında yanlış durumda kullanırsanız tersini yapabilir.
Thiago

1
Ama bana göre ng-if DOM üzerinde işlemez, bu yüzden ng-show / hide ile karşılaştırıldığında hızlıdır. yanlış mıyım lütfen bu noktada düzeltmeme izin verin.
Pardeep Jain

1
ng-if yanlış olarak değerlendirilirse daha hızlı olur, çünkü dediğiniz gibi DOM'ye hiçbir şey girilmesine gerek yoktur. Ancak, bu doğruysa, - muhtemelen oldukça karmaşık - öğeyi DOM'ya eklemek için bir ek yükünüz vardır.
Mawg, Monica'yı

"2) ng-if, true / false olarak değerlendirildiğinde kapsam oluşturur / yok eder. Ng-if'ye bağlı bir denetleyiciniz varsa, bu denetleyici kodu her seferinde"
Red Pea

35

Cevap basit değil:

Hedef makinelere (mobil ve masaüstüne) bağlıdır, verilerinizin doğasına, tarayıcıya, işletim sistemine, çalıştığı donanıma bağlıdır ... gerçekten bilmek istiyorsanız kıyaslama yapmanız gerekecektir.

Çoğunlukla bir bellek ve hesaplama sorunudur ... çoğu performans sorununda olduğu gibi, farklar tekrarlanan öğelerle (n) benzer listelerde, özellikle de iç içe geçmişken (nxn veya daha kötü) ve ayrıca bu öğelerin içinde ne tür hesaplamalar yaptığınızda önemli hale gelebilir :

  • ng-show : Eğer bu isteğe bağlı elemanlar sıklıkla varsa (yoğun), örneğin zamanın% 90'ı gibi, onları hazır bulundurmak daha hızlı olabilir ve özellikle içeriği ucuzsa (sadece düz metin, hiçbir şey) hesaplamak veya yüklemek için). Bu, DOM'u gizli öğelerle doldurduğundan belleği tüketir, ancak zaten var olan bir şeyi göster / gizle, tarayıcı için ucuz bir işlemdir.

  • ng-if : Aksine, öğeler gösterilmeyecekse (seyrek), özellikle içeriklerinin elde edilmesi pahalıysa (hesaplamalar / sıralı / filtrelenmiş, görüntüler, oluşturulan görüntüler) bunları gerçek zamanlı olarak oluşturun ve imha edin. Bu, nadir veya 'isteğe bağlı' öğeler için idealdir, DOM'u doldurmamak açısından bellek tasarrufu sağlar, ancak çok sayıda hesaplama (öğe oluşturma / yok etme) ve bant genişliğine (uzak içerik alma) mal olabilir. Ayrıca görünümde ne kadar hesapladığınıza (filtreleme / sıralama) ve modele zaten sahip olduğunuza (önceden sıralanmış / önceden filtrelenmiş veriler) bağlıdır.


2
Teknik gerçekler için diğer cevaplar. Bu bilgelik için. Önemsiz Açısal uygulamalar açıkça oluşturdunuz efendim! +1
poshest

Bu problem açısaldan öte, bilgisayar biliminde temel bir problem, bir yöntemin diğerinden daha verimli olduğu bir nokta var. Genellikle bu bazı kıyaslamalarla bulunabilir. Böylece madde sayısına bağlı olarak bir yöntemle diğeri arasında geçiş yapabilirsiniz ... Benzer konu: math.stackexchange.com/questions/1632739/…
Christophe Roussy

12

Önemli bir not:

ngIf (ngShow'dan farklı olarak) genellikle beklenmedik sonuçlar doğurabilecek alt kapsamlar oluşturur.

Bununla ilgili bir sorunum vardı ve neler olduğunu anlamak için ÇOK zaman harcadım.

(Yönergem model değerlerini yanlış kapsama yazıyordu.)

Bu nedenle, çok yavaş koşmadığınız sürece saçlarınızı kurtarmak için ngShow'u kullanın.

Performans farkı zaten farkedilmez ve henüz test olmadan kimin lehine olduğundan emin değilim ...


8
$parent.scopevarBir ngIf içindeki veri bağlarında kullanmak , ngIf kullanırken çocuk kapsamı sorunları gibi şeyleri düzeltir
meconroy

2
Bu tamamen doğru değil (orijinal @ user2173353'ün yorumu, yani). İyi uygulamalara sadık kalırsanız, başınız derde girmez. Bu oldukça basit bir kural: "nokta yoksa, yanlış yapıyorsun". Nasıl çalıştığına dair bir demo için buraya bakın: bit.ly/1SPv4wL . Başka bir harika referans (bkz. Hata # 2): bit.ly/1QfFeWd > ( Yönergem model değerlerini yanlış kapsama yazıyordu.) Bu, yukarıdaki uygulamaya bağlı kalmamanın sonucudur.
piotr.d

1
@ piotr.d Haklısınız, ancak bu yeni başlayanların odaklanması gerekebilecek bir şey değil ve performans iyileştirmelerini sonuna kadar bırakmanın daha iyi olduğunu söyleyen en iyi uygulama var (özellikle gerçeklikte iyileştirmeler olmayabilecek performans iyileştirmeleri) ). Her ngIfyerde bu performansı artıracak inanan insanlar gördüm . Bu sadece doğru değildir ve hangisinin en iyisi olduğunu söyleyemez ngIfveya ngShowbelirli bir durumda bir test veya derin bir analiz olmadan. Yani, ngIfbiri kötü bir performans görene veya ne yaptığını
bilinceye kadar unutmayı öneririm

2
İyi bir nokta. Ancak controllerAs kullanmak bunu sorun yaratmaz. Örneğin, bkz. John Papa'nın controllerAs ve vm'yi ele geçirmesi .
jsruok

4

ng-include ve on ng-denetleyicide ng-include üzerinde büyük bir etkiye sahip olacaksa, gerekli kısmi yüklemez ve ng-denetleyicide bayrak doğru olmadığı sürece işlem yapmaz, bayrak olmadığı sürece denetleyiciyi yüklemez true ama sorun bir bayrak ng yanlış olduğunda-bayrak true olduğunda DOM'dan kaldırırsa bu durumda DOM yeniden yükleyecek ng-show daha iyidir, bir kez ng-if daha iyi


4

ng-show or ng-hideİçeriği kullanırsanız (örn. Sunucudan küçük resimler), ifade değerine bakılmaksızın yüklenir, ancak ifadenin değerine göre görüntülenir.

Eğer ng-ifiçeriği kullanırsanız sadece ng-if ifadesi doğru olarak değerlendirilirse yüklenecektir.

Ng-if kullanmak, sunucudan veri veya görüntü yükleyeceğiniz ve bunları yalnızca kullanıcının etkileşimine bağlı olarak göstereceğiniz bir durumda iyi bir fikirdir. Bu şekilde sayfa yüklemeniz gereksiz yoğun yoğun görevler tarafından engellenmeyecektir.


CSS DOM kapsayıcılarını gizlese bile çoğu tarayıcı resim yükleyeceğinden bu özellikle kullanışlıdır. Genellikle etiketin srcniteliğini ararlar img, mevcut olduğunda yüklenir!
Christophe Roussy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.