Saya memiliki dataset besar beberapa ribu baris dengan masing-masing sekitar 10 bidang, sekitar 2MB data. Saya perlu menampilkannya di browser. Pendekatan yang paling mudah (mengambil data, memasukkannya $scope
, ng-repeat=""
melakukan tugasnya) berfungsi dengan baik, tetapi membeku browser selama sekitar setengah menit ketika mulai memasukkan node ke DOM. Bagaimana saya harus mendekati masalah ini?
Salah satu opsi adalah menambahkan baris $scope
secara bertahap dan menunggu untuk ngRepeat
menyelesaikan memasukkan satu chunk ke DOM sebelum pindah ke yang berikutnya. Tapi AFAIK ngRepeat tidak melaporkan kembali ketika selesai "berulang", jadi itu akan menjadi jelek.
Pilihan lain adalah untuk membagi data pada server menjadi beberapa halaman dan mengambilnya dalam beberapa permintaan, tetapi itu lebih buruk.
Saya melihat melalui dokumentasi Angular untuk mencari sesuatu seperti ng-repeat="data in dataset" ng-repeat-steps="500"
, tetapi tidak menemukan apa pun. Saya cukup baru dalam cara Angular, jadi ada kemungkinan bahwa saya kehilangan poin sepenuhnya. Apa praktik terbaik dalam hal ini?
limitTo
untuk menampilkan hanya 20 item:<p ng-repeat="data in dataset | limitTo:20">{{data}}</p>
Ini hanya menampilkan 20 item. Kemudian Anda dapat menggunakan halaman dan menunjukkan 10 item berikutnya atau sesuatu seperti itu. :)Jawaban:
Saya setuju dengan @ AndreM96 bahwa pendekatan terbaik adalah hanya menampilkan jumlah baris terbatas, UX lebih cepat dan lebih baik, ini bisa dilakukan dengan pagination atau dengan scroll tak terbatas.
Scroll tanpa batas dengan Angular sangat sederhana dengan filter limitTo . Anda hanya perlu menetapkan batas awal dan ketika pengguna meminta lebih banyak data (saya menggunakan tombol untuk kesederhanaan) Anda menambah batas.
Ini JsBin .
Pendekatan ini bisa menjadi masalah bagi ponsel karena biasanya mereka tertinggal ketika menggulir banyak data, jadi dalam hal ini saya pikir pagination lebih cocok.
Untuk melakukannya, Anda akan memerlukan filter limitTo dan juga filter khusus untuk menentukan titik awal dari data yang ditampilkan.
Ini JSBin dengan pagination.
sumber
Pendekatan terpanas - dan bisa dibilang paling scalable - untuk mengatasi tantangan ini dengan dataset besar diwujudkan dengan pendekatan directive collectionRepeat directive dan implementasi lain seperti itu. Istilah mewah untuk ini adalah 'penyumbatan oklusi' , tetapi Anda dapat meringkasnya sebagai: jangan hanya membatasi jumlah elemen DOM yang diberikan ke nomor paginasi acak (tapi masih tinggi) seperti 50, 100, 500 ... sebagai gantinya , batasi hanya elemen sebanyak yang dapat dilihat pengguna .
Jika Anda melakukan sesuatu seperti apa yang umumnya dikenal sebagai "pengguliran tak terbatas", Anda mengurangi jumlah DOM awal , tetapi cepat menggembung setelah beberapa penyegaran, karena semua elemen baru itu hanya ditempel di bagian bawah. Pengguliran datang ke perayapan, karena pengguliran adalah tentang jumlah elemen. Tidak ada yang tak terbatas tentang itu.
Padahal,
collectionRepeat
pendekatannya adalah menggunakan elemen sebanyak yang sesuai dengan viewport, dan kemudian mendaur ulangnya . Ketika satu elemen berputar keluar dari pandangan, itu terlepas dari pohon render, diisi ulang dengan data untuk item baru dalam daftar, lalu disambungkan kembali ke pohon render di ujung lain daftar. Ini adalah cara tercepat yang diketahui manusia untuk mendapatkan informasi baru masuk dan keluar dari DOM, memanfaatkan serangkaian elemen yang ada, daripada siklus tradisional buat / hancurkan ... buat / hancurkan. Dengan menggunakan pendekatan ini, Anda dapat benar-benar menerapkan gulir yang tak terbatas .Perhatikan bahwa Anda tidak harus menggunakan Ionic untuk menggunakan / hack / adapt
collectionRepeat
, atau alat lain yang seperti itu. Itu sebabnya mereka menyebutnya open-source. :-) (Konon, tim Ionic melakukan beberapa hal yang cukup cerdik, layak mendapat perhatian Anda.)Setidaknya ada satu contoh bagus untuk melakukan sesuatu yang sangat mirip di Bereaksi. Hanya alih-alih mendaur ulang elemen dengan konten yang diperbarui, Anda hanya memilih untuk tidak membuat apa pun di pohon yang tidak terlihat. Ini berkobar cepat pada 5000 item, meskipun implementasi POC yang sangat sederhana memungkinkan sedikit ...
Juga ... untuk menggemakan beberapa pos lainnya, menggunakan
track by
sangat membantu, bahkan dengan kumpulan data yang lebih kecil. Anggap itu wajib.sumber
Saya merekomendasikan untuk melihat ini:
Mengoptimalkan AngularJS: 1200ms hingga 35ms
mereka membuat arahan baru dengan mengoptimalkan ng-repeat di 4 bagian:
proyeknya ada di github:
Pemakaian:
1- sertakan file-file ini dalam aplikasi satu halaman Anda:
2- menambah ketergantungan modul:
3- ganti ng-repeat
Nikmati!
sumber
sly-repeat
tetapi tidak ada yang membantu saya hasilnya masih lambat dan lag browser juga mendapatkan pelanggaran[Violation] 'setTimeout' handler took 54ms
,[Violation] 'scroll' handler took 1298ms
Selain semua petunjuk di atas seperti track by dan loop yang lebih kecil, yang ini juga banyak membantu saya
sepotong kode ini akan mencetak nama setelah dimuat, dan berhenti menontonnya setelah itu. Demikian pula, untuk ng-pengulangan, itu bisa digunakan sebagai
Namun itu hanya bekerja untuk AngularJS versi 1.3 dan lebih tinggi. Dari http://www.befundoo.com/blog/optimizing-ng-repeat-in-angularjs/
sumber
::
pengulangan dan ekspresi? Dokumen mengatakan sebaliknya, tetapi saya tidak yakin cara untuk menguji apakah ini berfungsi. docs.angularjs.org/guide/expressionAnda dapat menggunakan "lacak dengan" untuk meningkatkan kinerja:
Lebih cepat dari:
ref: https://www.airpair.com/angularjs/posts/angularjs-performance-large-applications
sumber
Jika semua baris Anda memiliki ketinggian yang sama, Anda harus melihat virtualisasi ng-repeat: http://kamilkp.github.io/angular-vs-repeat/
Demo ini terlihat sangat menjanjikan (dan mendukung pengguliran inersia)
sumber
Aturan No.1: Jangan pernah biarkan pengguna menunggu apa pun.
Yang perlu diingat adalah halaman yang terus tumbuh yang membutuhkan 10 detik muncul jauh lebih cepat daripada menunggu 3 detik sebelum layar kosong dan dapatkan sekaligus.
Jadi, alih-alih membuat halaman cepat, biarkan saja halaman tampak cepat, bahkan jika hasil akhirnya lebih lambat:
Kode di atas membiarkan daftar untuk bertambah baris demi baris, dan selalu lebih lambat dari render sekaligus. Tetapi bagi pengguna tampaknya lebih cepat.
sumber
Pengguliran virtual adalah cara lain untuk meningkatkan kinerja pengguliran ketika berhadapan dengan daftar besar dan dataset besar.
Salah satu cara untuk mengimplementasikan ini adalah dengan menggunakan Bahan Angular
md-virtual-repeat
seperti yang ditunjukkan pada Demo ini dengan 50.000 itemDiambil langsung dari dokumentasi virtual repeat:
sumber
Versi lain @Steffomio
Alih-alih menambahkan setiap item secara terpisah, kami dapat menambahkan item dengan potongan.
sumber
Kadang-kadang apa yang terjadi, Anda mendapatkan data dari server (atau back-end) dalam beberapa ms (misalnya saya saya asumsikan 100 ms ) tetapi butuh lebih banyak waktu untuk ditampilkan di halaman web kami (katakanlah dibutuhkan 900 ms untuk tampilan).
Jadi, Apa yang terjadi di sini adalah 800 ms. Dibutuhkan hanya untuk membuat halaman web.
Apa yang saya lakukan dalam aplikasi web saya adalah, saya telah menggunakan pagination (atau Anda dapat menggunakan scrolling tak terbatas juga) untuk menampilkan daftar data. Katakanlah saya menunjukkan 50 data / halaman.
Jadi saya tidak akan memuat render semua data sekaligus, hanya 50 data yang saya muat awalnya yang hanya membutuhkan 50 ms (saya asumsikan di sini).
jadi total waktu di sini berkurang dari 900 ms menjadi 150 ms, setelah pengguna meminta halaman berikutnya lalu menampilkan 50 data berikutnya dan seterusnya.
Semoga ini akan membantu Anda untuk meningkatkan kinerja. Semua yang terbaik
sumber
yang memuat data saat mencapai ke bawah halaman dan menghapus setengah dari data yang dimuat sebelumnya dan ketika mencapai ke atas div lagi data sebelumnya (tergantung pada nomor halaman) akan dimuat menghapus setengah dari data saat ini Jadi pada DOM pada suatu waktu hanya ada data terbatas yang dapat mengarah pada kinerja yang lebih baik daripada merender seluruh data pada beban.
KODE HTML:
KODE Sudut:
Demo dengan arahan
Tergantung pada ketinggian divisi itu memuat data dan pada gulir data baru akan ditambahkan dan data sebelumnya akan dihapus.
Kode HTML:
Kode Sudut:
Demo dengan kisi UI dengan Demo gulir tanpa batas
sumber
untuk kumpulan data besar dan beberapa nilai drop-down lebih baik digunakan
ng-options
daripadang-repeat
.ng-repeat
lambat karena loop semua nilai yang datang tetaping-options
hanya menampilkan ke opsi pilih.jauh lebih cepat daripada
sumber