Apakah ada cara, dalam JavaScript, untuk menghitung jumlah jam tangan sudut di seluruh halaman?
Kami menggunakan Batarang , tetapi itu tidak selalu sesuai dengan kebutuhan kami. Aplikasi kami besar dan kami tertarik untuk menggunakan tes otomatis untuk memeriksa apakah jumlah arloji naik terlalu banyak.
Ini juga akan berguna untuk menghitung jam tangan berdasarkan per-controller.
Sunting : inilah usaha saya. Ini menghitung jam tangan dalam segala hal dengan kelas ng-lingkup.
(function () {
var elts = document.getElementsByClassName('ng-scope');
var watches = [];
var visited_ids = {};
for (var i=0; i < elts.length; i++) {
var scope = angular.element(elts[i]).scope();
if (scope.$id in visited_ids)
continue;
visited_ids[scope.$id] = true;
watches.push.apply(watches, scope.$$watchers);
}
return watches.length;
})();
$scope
memiliki array pengamat $$ dengan jumlah pengamat pada pengontrol itu (baik, jika Anda memiliki beberapa ng-repeat atau sesuatu yang menciptakan ruang lingkup lain, itu tidak berfungsi dengan baik). Tapi saya pikir tidak ada cara untuk melihat semua jam tangan di seluruh aplikasi.Jawaban:
(Anda mungkin perlu mengubah
body
kehtml
atau ke mana pun Anda meletakkannyang-app
)Berkat erilem karena menunjukkan jawaban ini tidak ada
$isolateScope
pencarian dan pengamat berpotensi diduplikasi dalam jawaban / komentarnya.Terima kasih kepada Ben2307 untuk menunjukkan bahwa
'body'
mungkin perlu diubah.Asli
Saya melakukan hal yang sama kecuali saya memeriksa atribut data elemen HTML daripada kelasnya. Saya menjalankan milik Anda di sini:
http://fluid.ie/
Dan mendapatkan 83. Saya menjalankan milik saya dan mendapatkan 121.
Saya juga menaruh ini di tambang:
Dan tidak ada yang dicetak, jadi saya menduga milik saya lebih baik (karena menemukan lebih banyak arloji) - tetapi saya tidak memiliki pengetahuan sudut yang intim untuk mengetahui dengan pasti bahwa tambang bukan bagian yang tepat dari rangkaian solusi.
sumber
$scope
dan$$watcher
otomatis, atau ada kinerja yang mereka keluarkan?$compileProvider.debugInfoEnabled(false);
dalam proyek Anda, cuplikan ini akan menghitung nol pengamat.Saya pikir pendekatan yang disebutkan di atas tidak akurat karena mereka menghitung pengamat dalam cakupan ganda yang sama. Ini adalah versi bookmarklet saya:
https://gist.github.com/DTFagus/3966db108a578f2eb00d
Ini juga menunjukkan beberapa detail untuk menganalisis pengamat.
sumber
Berikut adalah solusi hack yang saya kumpulkan berdasarkan pemeriksaan struktur ruang lingkup. "Tampaknya" berhasil. Saya tidak yakin seberapa akurat ini dan itu pasti tergantung pada beberapa API internal. Saya menggunakan angularjs 1.0.5.
sumber
$rootScope.$new(true)
atau$scope.$new(true)
, di mana$scope
untuk controller, maka berjalan hierarki masih menemukan cakupan itu. Saya pikir itu berarti bahwa prototipe tidak terhubung, bukan bahwa ruang lingkupnya tidak dalam hierarki.Ada plugin chrome baru yang secara otomatis menunjukkan jumlah pengamat saat ini dan perubahan terakhir (+/-) kapan saja di aplikasi Anda ... benar-benar hebat.
https://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk
sumber
Karena saya baru-baru ini berjuang dengan jumlah pengamat yang tinggi dalam aplikasi saya, saya juga menemukan perpustakaan yang hebat, yang disebut ng-stats - https://github.com/kentcdodds/ng-stats . Ini memiliki pengaturan minimal dan memberi Anda jumlah pengamat di halaman saat ini + panjang siklus intisari. Itu juga bisa memproyeksikan grafik kecil waktu nyata.
sumber
Perbaikan kecil untuk jawaban Words Like Jared .
sumber
Di AngularJS 1.3.2,
countWatchers
metode ditambahkan ke modul ngMock:Referensi
AngularJS Changelog: 1.3.2
ngMock: $ rootScope.Scope. $ countWatchers
sumber
angular.element(document)
keangular.element('[ng-app]')
dan memasukkannya ke dalam bookmarklet dengan peringatan:alert('found ' + countWatchers() + ' watchers');
Saya mengambil kode di bawah ini langsung dari
$digest
fungsi itu sendiri. Tentu saja, Anda mungkin perlu memperbarui pemilih elemen aplikasi (document.body
) di bagian bawah.sumber
Ini adalah fungsi yang saya gunakan:
Fungsi ini menggunakan hash untuk tidak menghitung lingkup yang sama beberapa kali.
sumber
element.data()
kadang-kadang bisa tidak terdefinisi atau sesuatu (setidaknya pada aplikasi 1.0.5 yang saya punya kesalahan ketika saya menjalankan ini terpotong dan mencoba meneleponcountWatchers
). Hanya FYI.Ada fungsi rekursif yang diterbitkan oleh blog Lars Eidnes di http://larseidnes.com/2014/11/05/angularjs-the-bad-parts/ untuk mengumpulkan jumlah pengamat total. Saya membandingkan hasilnya menggunakan fungsi yang diposting di sini dan yang diposting di blog-nya, yang telah menghasilkan angka yang sedikit lebih tinggi. Saya tidak tahu yang mana yang lebih akurat. Baru ditambahkan di sini sebagai referensi lintas.
CATATAN: Anda mungkin perlu mengubah "ng-app" menjadi "data-ng-app" untuk aplikasi Angular Anda.
sumber
Jawaban Plantian lebih cepat: https://stackoverflow.com/a/18539624/258482
Berikut adalah fungsi yang saya tulis tangan. Saya tidak berpikir tentang menggunakan fungsi rekursif, tapi ini yang saya lakukan. Mungkin lebih ramping, saya tidak tahu.
Kemudian letakkan ini di dalam pengontrol tertinggi Anda (jika Anda menggunakan pengontrol global).
Dan akhirnya sebuah pasar buku:
sumber
Agak terlambat untuk pertanyaan ini, tetapi saya menggunakan ini
pastikan Anda menggunakan kueriSelektor yang benar.
sumber