Kapan sebaiknya ng-if vs. ng-show / ng-hide?

516

Saya mengerti itu ng-showdan ng-hidemempengaruhi kelas yang ditetapkan pada elemen dan yang ng-ifmengontrol apakah suatu elemen diberikan sebagai bagian dari DOM.

Apakah ada pedoman untuk memilih ng-iflebih dari ng-show/ ng-hideatau sebaliknya?

Patrice Chalin
sumber
5
mungkin duplikat dari apa perbedaan antara ng-if dan ng-show / ng-hide
Gajus
1
Tidak terkait dengan bahasa panah .
naXa

Jawaban:

703

Tergantung pada use case Anda tetapi untuk merangkum perbedaannya:

  1. ng-ifakan menghapus elemen dari DOM. Ini berarti bahwa semua penangan Anda atau apa pun yang melekat pada elemen-elemen itu akan hilang. Misalnya, jika Anda mengikat penangan klik ke salah satu elemen anak, ketika ng-ifdievaluasi menjadi false, elemen itu akan dihapus dari DOM dan penangan klik Anda tidak akan berfungsi lagi, bahkan setelah ng-ifkemudian mengevaluasi true dan menampilkan elemen. Anda harus memasang kembali pawang.
  2. ng-show/ng-hidetidak menghapus elemen dari DOM. Menggunakan gaya CSS untuk menyembunyikan / menampilkan elemen (catatan: Anda mungkin perlu menambahkan kelas Anda sendiri). Dengan cara ini penangan Anda yang melekat pada anak-anak tidak akan hilang.
  3. ng-ifmenciptakan ruang lingkup anak sementara ng-show/ng-hidetidak

Elemen yang tidak ada dalam DOM memiliki dampak kinerja yang lebih sedikit dan aplikasi web Anda mungkin tampak lebih cepat bila ng-ifdibandingkan dengan ng-show/ng-hide. Dalam pengalaman saya, perbedaannya dapat diabaikan. Animasi dimungkinkan saat menggunakan keduanya ng-show/ng-hidedan ng-if, dengan contoh untuk keduanya dalam dokumentasi Angular.

Pada akhirnya, pertanyaan yang perlu Anda jawab adalah apakah Anda dapat menghapus elemen dari DOM atau tidak?

markovuksanovic
sumber
19
Anda dapat menggunakan animasi dengan CSS3 ng-if. Periksa paragraf Animasi dan contoh dalam dokumen . Juga dengan ng-hide/ng-showpemilih css suka :first-childatau :nth-childtidak akan berfungsi dengan baik karena elemen yang tersembunyi juga akan dihitung.
Łukasz Wojciechowski
4
Layanan animasi di angular.dart relatif baru. Pada saat penulisan ini tidak tersedia.
markovuksanovic
44
Poin pertama Anda bukan masalah jika Anda menggunakan arahan (seperti ng-klik) untuk mengikat penangan, sebagaimana seharusnya.
Kevin C.
9
Juga, ng-ifbuat lingkup baru sementara ng-showtidak.
martin
8
Juga harus disebutkan bahwa menambah dan menghapus elemen dari DOM dapat menimbulkan biaya kinerja tinggi jika sering dilakukan.
Kevin C.
130

Lihat di sini untuk CodePen yang menunjukkan perbedaan cara kerja ng-if / ng-show, DOM-bijaksana.

@markovuksanovic telah menjawab pertanyaan dengan baik. Tapi saya datang dari perspektif lain: Saya selalu menggunakan ng-ifdan mengeluarkan elemen-elemen itu dari DOM, kecuali:

  1. Anda karena suatu alasan memerlukan data-binding dan $watch-es pada elemen Anda untuk tetap aktif saat mereka tidak terlihat. Formulir mungkin merupakan kasus yang bagus untuk ini, jika Anda ingin dapat memeriksa validitas pada input yang saat ini tidak terlihat, untuk menentukan apakah seluruh formulir valid.
  2. Anda menggunakan beberapa logika stateful yang sangat rumit dengan penangan event bersyarat, seperti yang disebutkan di atas. Yang mengatakan , jika Anda menemukan diri Anda secara manual melampirkan dan melepaskan penangan, sehingga Anda kehilangan status penting ketika Anda menggunakan ng-jika, tanyakan pada diri sendiri apakah keadaan itu akan lebih terwakili dalam model data, dan penangan diterapkan secara kondisional oleh arahan setiap kali elemen diberikan. Dengan kata lain, ada / tidaknya penangan adalah bentuk data negara. Keluarkan data itu dari DOM, dan masuk ke dalam model. Ada / tidaknya penangan harus ditentukan oleh data, dan dengan demikian mudah dibuat ulang.

Angular ditulis dengan sangat baik. Ini cepat, mengingat apa yang dilakukannya. Tapi yang dilakukannya adalah sejumlah sihir yang membuat hal-hal sulit (seperti pengikatan data 2 arah) terlihat mudah. Membuat semua hal itu terlihat mudah memerlukan beberapa overhead kinerja. Anda mungkin terkejut mengetahui berapa ratus atau ribuan kali fungsi setter dievaluasi selama $digestsiklus pada sebongkah DOM yang bahkan tidak ada yang melihatnya. Dan kemudian Anda menyadari bahwa Anda memiliki puluhan atau ratusan elemen tak kasat mata yang semuanya melakukan hal yang sama ...

Desktop mungkin memang cukup kuat untuk membuat sebagian besar masalah kecepatan eksekusi JS bisa diperdebatkan. Tetapi jika Anda sedang mengembangkan untuk seluler, menggunakan ng-jika kapan pun memungkinkan secara manusia seharusnya tidak perlu khawatir. Kecepatan JS masih penting pada prosesor seluler. Menggunakan ng-if adalah cara yang sangat mudah untuk mendapatkan optimasi yang berpotensi signifikan dengan biaya yang sangat, sangat rendah.

XML
sumber
6
Tambahan yang sangat bagus untuk jawaban di atas. Diberikan dengan beberapa konteks yang baik, yang juga membantu pengambilan keputusan. Terima kasih.
Sean
1
ng-showdapat bermanfaat saat Anda memiliki, katakan tab masing-masing dengan banyak konten yang membutuhkan waktu untuk membuat. Setelah rendering pertama, perpindahan antar tab akan instan, sedangkan ng-ifakan membutuhkan rendering ulang, peristiwa mengikat dll. Kelemahannya seperti yang Anda katakan, adalah membuat jam tangan berjalan di latar belakang. Angular sangat membutuhkanng-ifshowwatch
poshest
53

Dari pengalaman saya:

1) Jika halaman Anda memiliki toggle yang menggunakan ng-if / ng-show untuk menampilkan / menyembunyikan sesuatu, ng-jika menyebabkan lebih banyak penundaan browser (lebih lambat). Misalnya: jika Anda memiliki tombol yang digunakan untuk berganti antara dua tampilan, ng-show tampaknya lebih cepat.

2) ng-if akan membuat / menghancurkan lingkup ketika dievaluasi benar / salah. Jika Anda memiliki pengontrol yang terpasang pada ng-if, kode pengontrol itu akan dieksekusi setiap kali ng-if bernilai true. Jika Anda menggunakan ng-show, kode pengontrol hanya dijalankan sekali. Jadi jika Anda memiliki tombol yang berganti-ganti antara beberapa tampilan, menggunakan ng-if dan ng-show akan membuat perbedaan besar dalam cara Anda menulis kode pengontrol Anda.

Yi Z
sumber
5
Itu benar besar! ng-jika tidak serta-merta membuat frontend Anda lebih cepat. Semua tergantung dari kebutuhan Anda. Sebenarnya itu bisa membuat sebaliknya jika Anda menggunakan dalam situasi yang salah.
Thiago C. S Ventura
1
Tetapi menurut saya sebagai ng-jika tidak merender ke DOM sehingga lebih cepat dibandingkan dengan ng-show / sembunyikan. Apakah saya salah, tolong beri saya koreksi pada saat itu.
Pardeep Jain
1
ng-jika akan lebih cepat jika dievaluasi salah, karena, seperti yang Anda katakan, tidak ada yang perlu dimasukkan ke DOM. Tetapi, jika itu benar maka Anda memiliki overhead untuk memasukkan elemen - mungkin cukup rumit - ke DOM.
Mawg mengatakan mengembalikan Monica
"2) ng-if akan membuat / menghancurkan cakupan ketika bernilai true / false. Jika Anda memiliki pengontrol yang terpasang ke ng-if, kode pengontrol itu akan dieksekusi setiap kali"
The Red Pea
35

Jawabannya tidak sederhana:

Itu tergantung pada mesin target (mobile vs desktop), itu tergantung pada sifat data Anda, browser, OS, perangkat keras yang dijalankannya ... Anda perlu melakukan benchmark jika Anda benar-benar ingin tahu.

Ini sebagian besar masalah memori vs komputasi ... karena dengan sebagian besar masalah kinerja perbedaannya dapat menjadi signifikan dengan elemen berulang (n) seperti daftar, terutama ketika bersarang (nxn, atau lebih buruk) dan juga jenis komputasi apa yang Anda jalankan di dalam elemen-elemen ini. :

  • ng-show : Jika elemen-elemen opsional sering hadir (padat), seperti katakanlah 90% dari waktu, mungkin lebih cepat untuk membuatnya siap dan hanya menampilkan / menyembunyikannya, terutama jika kontennya murah (hanya teks biasa, tidak ada untuk menghitung atau memuat). Ini menghabiskan memori karena mengisi DOM dengan elemen tersembunyi, tetapi hanya menampilkan / menyembunyikan sesuatu yang sudah ada kemungkinan merupakan operasi yang murah untuk browser.

  • ng-if : Jika sebaliknya elemen cenderung tidak diperlihatkan (jarang) cukup buat dan hancurkan secara real time, terutama jika kontennya mahal (perhitungan / disortir / disaring, gambar, gambar yang dihasilkan). Ini ideal untuk elemen langka atau 'sesuai permintaan', ini menghemat memori dalam hal tidak mengisi DOM tetapi dapat menghabiskan banyak biaya komputasi (membuat / menghancurkan elemen) dan bandwidth (mendapatkan konten jarak jauh). Ini juga tergantung pada seberapa banyak Anda menghitung dalam tampilan (pemfilteran / penyortiran) vs apa yang sudah Anda miliki dalam model (data pra-diurutkan / pra-disaring).

Christophe Roussy
sumber
2
Jawaban lain untuk fakta teknis. Yang ini untuk kebijaksanaan. Anda jelas telah membangun aplikasi Angular non-sepele, Pak! +1
poshest
Masalah ini melampaui sudut, itu adalah masalah mendasar dalam ilmu komputer, ada titik di mana pada satu metode lebih efisien daripada yang lain. Biasanya ini dapat ditemukan melalui beberapa pembandingan. Jadi Anda bahkan dapat beralih antara satu metode dan yang lain tergantung pada jumlah item ... Topik serupa: math.stackexchange.com/questions/1632739/…
Christophe
12

Satu catatan penting:

ngIf (tidak seperti ngShow) biasanya membuat cakupan anak yang dapat menghasilkan hasil yang tidak terduga.

Saya memiliki masalah yang berkaitan dengan ini dan saya telah menghabiskan banyak waktu untuk mencari tahu apa yang sedang terjadi.

(Arahan saya menulis nilai modelnya ke ruang lingkup yang salah.)

Jadi, untuk menyelamatkan rambut Anda cukup gunakan ngShow kecuali jika Anda berlari terlalu lambat.

Perbedaan kinerja hampir tidak terlihat pula dan saya belum yakin siapa yang mendukungnya tanpa tes ...

pengguna2173353
sumber
8
Menggunakan $parent.scopevarbinding data dalam ngIf akan memperbaiki hal-hal seperti masalah cakupan anak saat menggunakan ngIf
meconroy
2
Ini tidak sepenuhnya benar (komentar asli @ user2173353, yaitu). Jika Anda berpegang teguh pada praktik yang baik, Anda tidak akan mendapat masalah. Itu aturan yang cukup mendasar: "jika tidak ada titik, Anda salah melakukannya". Lihat di sini untuk demo cara kerjanya: bit.ly/1SPv4wL . Referensi hebat lainnya (lihat kesalahan # 2): bit.ly/1QfFeWd > (Arahan saya menulis nilai modelnya ke lingkup yang salah.) Ini adalah hasil dari tidak berpegang teguh pada praktik di atas.
piotr.d
1
@ piotr.d Anda benar, tetapi itu bukan sesuatu yang mungkin perlu difokuskan oleh pemula dan ada praktik terbaik lain yang mengatakan bahwa lebih baik meninggalkan peningkatan kinerja pada akhirnya (terutama peningkatan kinerja yang mungkin bukan perbaikan dalam kenyataan) ). Saya telah melihat orang menaruh ngIfkepercayaan bahwa ini akan meningkatkan kinerja. Ini tidak benar dan tidak ada yang bisa mengatakan mana yang terbaik, ngIfatau ngShow, tanpa tes atau analisis mendalam dalam kasus tertentu. Jadi, saya masih merekomendasikan untuk melupakan ngIf, sampai orang melihat kinerja yang buruk atau tahu apa yang dia lakukan
user2173353
2
Poin yang bagus. Tetapi menggunakan controllerAs membuat ini bukan masalah. Lihat, misalnya, John Papa mengambil controllerAs dan vm .
jsruok
4

ng-jika pada ng-include dan pada ng-controller akan berdampak besar pada ng-include tidak akan memuat parsial yang diperlukan dan tidak memproses kecuali flag benar pada ng-controller tidak akan memuat controller kecuali flag benar tetapi masalahnya adalah ketika sebuah bendera menjadi palsu di ng-jika ia akan menghapus dari DOM ketika bendera menjadi benar kembali itu akan memuat ulang DOM dalam hal ini ng-show lebih baik, untuk satu kali acara ng-jika lebih baik

Saad Ahmed
sumber
4

Jika Anda menggunakan ng-show or ng-hidekonten (mis. Thumbnail dari server) akan dimuat terlepas dari nilai ekspresi tetapi akan ditampilkan berdasarkan nilai ekspresi.

Jika Anda menggunakan ng-ifkonten akan dimuat hanya jika ekspresi ng-if bernilai kebenaran.

Menggunakan ng-if adalah ide yang bagus dalam situasi di mana Anda akan memuat data atau gambar dari server dan menunjukkannya hanya tergantung pada interaksi pengguna. Dengan cara ini, memuat halaman Anda tidak akan diblokir oleh tugas intensif yang tidak perlu.

appdroid
sumber
Ini sangat berguna karena sebagian besar browser akan memuat gambar bahkan jika CSS menyembunyikan wadah DOM mereka. Mereka biasanya hanya mencari srcatribut dari imgtag, ketika itu akan dimuat!
Christophe Roussy