Dengan menggunakan Angularjs, saya perlu menampilkan layar pemuatan (spinner sederhana) hingga permintaan ajax selesai. Harap sarankan ide apa pun dengan cuplikan kode.
angularjs
angularjs-directive
Badhrinath Canessane
sumber
sumber
$httpProvider.interceptors
karena dapat menangani kapan permintaan ajax dimulai dan kapan itu berakhir. Itulah mengapa$watch
tidak perlu lagi mendeteksi kapan ajax call dimulai dan diakhiri.Jawaban:
Daripada menyiapkan variabel cakupan untuk menunjukkan status pemuatan data, lebih baik memiliki direktif yang melakukan segalanya untuk Anda:
Dengan arahan ini, yang perlu Anda lakukan adalah memberikan elemen animasi pemuatan dengan atribut 'loading':
Anda dapat memiliki beberapa pemintal pemuatan di halaman. di mana dan bagaimana mengatur tata letak pemintal itu terserah Anda dan direktif hanya akan mengaktifkan / menonaktifkannya untuk Anda secara otomatis.
sumber
Berikut contohnya. Ia menggunakan metode ng-show sederhana dengan bool.
HTML
ANGULARJS
Tentu saja Anda dapat memindahkan kode html kotak pemuatan ke dalam sebuah direktif, lalu gunakan $ watch di $ scope.loading. Dalam hal ini:
HTML :
ANGULARJS DIRECTIVE :
PLUNK : http://plnkr.co/edit/AI1z21?p=preview
sumber
ui-router
, tidak tahu mengapaloading=true
tidak dapat diaturSaya menggunakan ngProgress untuk ini.
Tambahkan 'ngProgress' ke dependensi Anda setelah Anda menyertakan file script / css di HTML Anda. Setelah Anda melakukannya, Anda dapat mengatur sesuatu seperti ini, yang akan dipicu ketika perubahan rute terdeteksi.
Untuk permintaan AJAX, Anda dapat melakukan sesuatu seperti ini:
Ingatlah untuk menambahkan 'ngProgress' ke dependensi pengontrol sebelum melakukannya. Dan jika Anda melakukan beberapa permintaan AJAX, gunakan variabel inkremental dalam cakupan aplikasi utama untuk melacak saat permintaan AJAX Anda selesai sebelum memanggil 'ngProgress.complete ();'.
sumber
menggunakan pendingRequests tidak benar karena seperti yang disebutkan dalam dokumentasi Angular, properti ini terutama dimaksudkan untuk digunakan untuk tujuan debugging.
Yang saya rekomendasikan adalah menggunakan pencegat untuk mengetahui apakah ada panggilan Async aktif.
dan kemudian periksa apakah activeCalls nol atau tidak di direktif melalui $ watch.
sumber
Cara terbaik untuk melakukannya adalah dengan menggunakan pencegat respons bersama dengan perintah khusus . Dan proses selanjutnya dapat ditingkatkan menggunakan mekanisme pub / sub menggunakan metode $ rootScope. $ Broadcast & $ rootScope. $ On .
Karena seluruh proses didokumentasikan dalam artikel blog yang ditulis dengan baik , saya tidak akan mengulanginya lagi di sini. Silakan merujuk ke artikel itu untuk mendapatkan implementasi yang Anda butuhkan.
sumber
Mengacu pada jawaban ini
https://stackoverflow.com/a/17144634/4146239
Bagi saya adalah solusi terbaik tetapi ada cara untuk menghindari penggunaan jQuery.
Anda perlu mengganti $ (element) .show (); dan (elemen) .show (); dengan $ scope.loadingStatus = 'true'; dan $ scope.loadingStatus = 'false';
Kemudian, Anda perlu menggunakan variabel ini untuk menyetel atribut ng-show dari elemen tersebut.
sumber
Ketikan dan Implementasi Angular
pengarahan
Cakupan
Template
sumber
Jika Anda menggunakan Restangular (yang luar biasa), Anda dapat membuat animasi selama panggilan api. Inilah solusi saya. Tambahkan interceptor respons dan interseptor permintaan yang mengirimkan siaran rootscope. Kemudian buat arahan untuk mendengarkan respons dan permintaan itu .:
Berikut arahannya:
sumber
Sertakan ini di "app.config" Anda:
Dan tambahkan kode ini:
sumber
Gunakan angular-busy :
Tambahkan cgBusy ke aplikasi / modul Anda:
Tambahkan janji Anda untuk
scope
:Di template html Anda:
sumber
Juga, ada demo bagus yang menunjukkan bagaimana Anda bisa menggunakan
Angularjs
animasi dalam proyek Anda.Tautannya ada di sini (Lihat pojok kiri atas) .
Ini open source. Ini tautan untuk mengunduh
Dan ini tautan untuk tutorial ;
Maksud saya adalah, lanjutkan dan unduh file sumber dan kemudian lihat bagaimana mereka mengimplementasikan spinner. Mereka mungkin menggunakan pendekatan yang sedikit lebih baik. Jadi, selesaikan proyek ini.
sumber
Berikut contoh interseptor sederhana, saya mengatur mouse untuk menunggu ketika ajax dimulai dan mengaturnya ke otomatis ketika ajax berakhir.
Kode harus ditambahkan dalam konfigurasi aplikasi
app.config
. Saya menunjukkan cara mengubah mouse saat memuat status tetapi di sana dimungkinkan untuk menampilkan / menyembunyikan konten loader apa pun, atau menambahkan, menghapus beberapa kelas css yang menampilkan loader.Interceptor akan berjalan pada setiap panggilan ajax, jadi tidak perlu membuat variabel boolean khusus ($ scope.loading = true / false dll.) Pada setiap panggilan http.
Interceptor menggunakan jqLite bersudut yang dibangun di https://docs.angularjs.org/api/ng/function/angular.element sehingga tidak diperlukan Jquery.
sumber
Buat Directive dengan atribut show and size (Anda juga bisa menambahkan lebih banyak)
dan dalam html digunakan sebagai
Dalam variabel show, berikan true saat ada promise yang dijalankan dan buat false saat permintaan selesai. Demo aktif - Demo contoh direktif Angular Loader di JsFiddle
sumber
Saya membangun jawaban @ DavidLin sedikit untuk menyederhanakannya - menghilangkan ketergantungan pada jQuery dalam arahan. Saya dapat mengonfirmasi bahwa ini berfungsi saat saya menggunakannya dalam aplikasi produksi
Saya menggunakan
ng-show
alih - alih panggilan jQuery untuk menyembunyikan / menampilkan file<div>
.Inilah
<div>
yang saya tempatkan tepat di bawah<body>
tag pembuka :Dan inilah CSS yang menyediakan overlay untuk memblokir UI saat panggilan $ http sedang dibuat:
Kredit CSS diberikan ke @Steve Seeger - postingannya: https://stackoverflow.com/a/35470281/335545
sumber
Anda dapat menambahkan kondisi dan kemudian mengubahnya melalui rootscope. Sebelum permintaan ajax Anda, Anda cukup memanggil $ rootScope. $ Emit ('stopLoader');
Ini jelas bukan solusi terbaik tetapi masih akan berhasil.
sumber