Saya memiliki masalah kinerja yang sepertinya tidak bisa saya tangani. Saya memiliki pencarian instan tetapi agak lambat, karena mulai mencari pada masing-masing keyup()
.
JS:
var App = angular.module('App', []);
App.controller('DisplayController', function($scope, $http) {
$http.get('data.json').then(function(result){
$scope.entries = result.data;
});
});
HTML:
<input id="searchText" type="search" placeholder="live search..." ng-model="searchText" />
<div class="entry" ng-repeat="entry in entries | filter:searchText">
<span>{{entry.content}}</span>
</div>
Data JSON bahkan tidak sebesar itu, hanya 300KB, saya pikir apa yang harus saya selesaikan adalah menunda ~ 1 detik pada pencarian untuk menunggu pengguna selesai mengetik, alih-alih melakukan tindakan pada setiap penekanan tombol. AngularJS melakukan ini secara internal, dan setelah membaca dokumen dan topik lain di sini saya tidak dapat menemukan jawaban spesifik.
Saya akan menghargai petunjuk tentang bagaimana saya dapat menunda pencarian instan.
Jawaban:
(Lihat jawaban di bawah untuk solusi 1.3 Sudut.)
Masalahnya di sini adalah bahwa pencarian akan mengeksekusi setiap kali model berubah, yang merupakan setiap tindakan keyup pada input.
Akan ada cara yang lebih bersih untuk melakukan ini, tetapi mungkin cara termudah adalah dengan mengganti ikatan sehingga Anda memiliki properti $ scope didefinisikan di dalam Controller Anda di mana filter Anda beroperasi. Dengan begitu Anda dapat mengontrol seberapa sering variabel $ scope diperbarui. Sesuatu seperti ini:
JS:
HTML:
sumber
ng-model
tidak akan berfungsi di dalam modal angular-ui bootstrapMEMPERBARUI
Sekarang lebih mudah dari sebelumnya (Angular 1.3), cukup tambahkan opsi debounce pada model.
<input type="text" ng-model="searchStr" ng-model-options="{debounce: 1000}">
Pembaruan yang diperbarui:
http://plnkr.co/edit/4V13gK
Dokumentasi tentang ngModelOptions:
https://docs.angularjs.org/api/ng/directive/ngModelOptions
Metode lama:
Inilah metode lain tanpa ketergantungan di luar sudut itu sendiri.
Anda perlu mengatur batas waktu dan membandingkan string Anda saat ini dengan versi yang lalu, jika keduanya sama maka melakukan pencarian.
dan ini masuk ke dalam pandangan Anda:
Plunker wajib: http://plnkr.co/dAPmwf
sumber
Dalam Angular 1.3 saya akan melakukan ini:
HTML:
Pengendali:
Pada dasarnya Anda mengatakan sudut untuk dijalankan
myDebouncedFunction()
, ketikamsg
variabel ruang lingkup berubah. Atributng-model-options="{debounce: 1000}"
memastikan bahwamsg
hanya dapat memperbarui satu detik sekali.sumber
Sekarang kita dapat mengatur opsi ng-model-opsi dengan waktu dan ketika blur, model harus segera diganti jika tidak menyimpannya akan memiliki nilai yang lebih tua jika penundaan tidak selesai.
sumber
Bagi mereka yang menggunakan keyup / keydown di markup HTML. Ini tidak menggunakan arloji.
JS
HTML
sumber
Pembaruan model yang didebitkan / dibatasi untuk angularjs: http://jsfiddle.net/lgersman/vPsGb/3/
Dalam kasus Anda, tidak ada yang bisa dilakukan selain menggunakan arahan dalam kode jsfiddle seperti ini:
Ini pada dasarnya sepotong kecil kode yang terdiri dari satu directive angular directive bernama "ng-ampere-debounce" memanfaatkan http://benalman.com/projects/jquery-throttle-debounce-plugin/ yang dapat dilampirkan ke elemen dom apa pun. Arahan mengatur ulang penangan acara terlampir sehingga dapat mengontrol kapan harus mencekik acara.
Anda dapat menggunakannya untuk pembatasan / debouncing * model pembaruan sudut * pengatur acara sudut - [acara] * penangan acara jquery
Lihat: http://jsfiddle.net/lgersman/vPsGb/3/
Arahan akan menjadi bagian dari kerangka kerja Orangevolt Ampere ( https://github.com/lgersman/jquery.orangevolt-ampere ).
sumber
Hanya untuk pengguna yang dialihkan ke sini:
Seperti yang diperkenalkan di
Angular 1.3
Anda dapat menggunakan atribut ng-model-options :sumber
Saya percaya bahwa cara terbaik untuk menyelesaikan masalah ini adalah dengan menggunakan plugin jQuery throttle / debounce dari Ben Alman . Menurut pendapat saya, tidak perlu menunda acara dari setiap bidang dalam formulir Anda.
Hanya bungkus $ scope Anda. $ Watch handling function dalam $ .debounce seperti ini:
sumber
Solusi lain adalah menambahkan fungsionalitas penundaan ke pembaruan model. Arahan sederhana tampaknya melakukan trik:
Pemakaian:
Jadi Anda hanya menggunakan
delayed-model
di tempatng-model
dan menentukan diinginkandata-delay
.Demo: http://plnkr.co/edit/OmB4C3jtUD2Wjq5kzTSU?p=preview
sumber
model: '=delayedModel'
kerjanya? Atau bisakah Anda mengarahkan saya ke tautan di mana saya dapat menemukannya?element.on('change')
hanya memicu blur. (1) Apakah ada pekerjaan? (2) bagaimana cara memanggil fungsi controller pada perubahan teks?Saya memecahkan masalah ini dengan arahan yang pada dasarnya apa yang dilakukannya adalah untuk mengikat ng-model nyata pada atribut khusus yang saya tonton dalam arahan, kemudian menggunakan layanan debounce saya memperbarui atribut direktif saya, sehingga pengguna menonton pada variabel yang ia mengikat ke model-debo alih-alih model-ng.
Pemakaian:
Dan di controller:
Demo di jsfiddle: http://jsfiddle.net/6K7Kd/37/
layanan $ debounce dapat ditemukan di sini: http://jsfiddle.net/Warspawn/6K7Kd/
Terinspirasi oleh akhirnyaBind direktif http://jsfiddle.net/fctZH/12/
sumber
Angular 1.3 akan memiliki opsi ng-model-opsi, tetapi sampai saat itu, Anda harus menggunakan timer seperti kata Josue Ibarra. Namun, dalam kodenya ia meluncurkan timer pada setiap tombol yang ditekan. Juga, dia menggunakan setTimeout, ketika di Angular kita harus menggunakan $ timeout atau menggunakan $ apply di akhir setTimeout.
sumber
Mengapa semua orang ingin menggunakan arloji? Anda juga bisa menggunakan fungsi:
sumber
Saya pikir cara termudah di sini adalah untuk memuat ulang json atau memuatnya sekali
$dirty
dan kemudian pencarian filter akan mengurus sisanya. Ini akan menghemat panggilan http ekstra dan jauh lebih cepat dengan data yang dimuat sebelumnya. Ingatan akan sakit, tetapi itu sangat berharga.sumber