Saya terus mengalami masalah dengan masalah debugging di templat KnockoutJS.
Katakanlah saya ingin mengikat ke properti yang disebut " items
" tetapi dalam template saya membuat kesalahan ketik dan mengikat ke properti (tidak ada) " item
".
Menggunakan debugger Chrome hanya memberi tahu saya:
"item" is not defined.
Apakah ada alat, teknik, atau gaya pengkodean yang membantu saya mendapatkan informasi lebih lanjut tentang masalah yang mengikat?
sumber
name
adalah tindakan yang dapat diamatiname.subscribe(function(newValue) { console.log("name", newValue); });
foreach
skenario dan saya merasa lebih mudah untuk melihat pada halaman dalam markup yang diberikan relevan daripada menyaring melalui konsol. Tergantung situasinya saja. Beberapa lagi pemikiran saya di sini: knockmeout.net/2013/06/… . Juga, Anda mungkin ingin mencatat versi "bersih" di binding seperti Andaconsole.log(ko.toJS(valueAccessor())
.Jika Anda menggunakan Chrome untuk pengembangan, ada ekstensi yang sangat bagus (yang saya tidak berafiliasi) yang disebut debugger konteks Knockoutjs yang menunjukkan kepada Anda konteks yang mengikat langsung di panel Elemen Alat Pengembang.
sumber
Tetapkan Handler handler sekali , di suatu tempat di file perpustakaan JavaScript Anda.
daripada hanya menggunakannya suka ini:
Keuntungan
sumber
Saya menemukan satu lagi yang dapat membantu. Saya sedang men-debug beberapa binding dan mencoba menggunakan contoh Ryans. Saya mendapat kesalahan bahwa JSON menemukan lingkaran lingkaran.
Namun, menggunakan pendekatan ini menggantikan nilai data-bind dengan yang berikut:
Sekarang jika saya klik pada elemen PRE sambil membuka jendela debug krom, saya mendapatkan jendela variabel lingkup terisi dengan baik.
Menemukan cara yang lebih baik untuk itu:
sumber
Panduan langkah demi langkah
>=
ikon di kiri bawah Toolbar Pengembang Chrome, atau dengan membuka tab "Konsol" di Toolbar Pengembang Chrome, atau dengan menekan Ctrl+ Shift+Jko.dataFor($0)
ko.contextFor($0)
Apa ini ilmu hitam?
Trik ini adalah kombinasi fitur Chrome $ 0- $ 4 dan metode utilitas KnockoutJS . Singkatnya, Chrome mengingat unsur-unsur yang telah Anda pilih di Chrome Developer Toolbar dan mengekspos elemen ini di bawah alias
$0
,$1
,$2
,$3
,$4
. Jadi ketika Anda mengklik kanan sebuah elemen di browser Anda dan memilih 'Periksa elemen', elemen ini secara otomatis tersedia di bawah alias$0
. Anda dapat menggunakan trik ini dengan KnockoutJS, AngularJS, jQuery atau kerangka JavaScript lainnya.Sisi lain dari trik ini adalah metode utilitas KnockoutJS yaitu ko.dataFor dan ko.contextFor:
ko.dataFor(element)
- mengembalikan data yang tersedia untuk mengikat elemenko.contextFor(element)
- mengembalikan seluruh konteks yang mengikat yang tersedia untuk elemen DOM.Ingat, Konsol JavaScript Chrome adalah lingkungan runtime JavaScript yang berfungsi penuh. Ini berarti Anda tidak terbatas hanya dengan melihat variabel. Anda dapat menyimpan output
ko.contextFor
dan memanipulasi model view langsung dari konsol. Cobavar root = ko.contextFor($0).$root; root.addContact();
dan lihat apa yang terjadi :-)Selamat men-debug!
sumber
Lihatlah hal yang sangat sederhana yang saya gunakan:
Atau
Kemudian dalam html, katakanlah, Anda memiliki:
Ganti saja dengan
Lebih maju:
Nikmati :)
MEMPERBARUI
Hal lain yang menjengkelkan adalah ketika Anda mencoba untuk mengikat ke nilai yang tidak ditentukan. Bayangkan dalam contoh di atas bahwa objek data hanya {} bukan {value: 'some text'}. Dalam hal ini Anda akan berada dalam masalah, tetapi dengan tweak berikut Anda akan baik-baik saja:
sumber
Saya membuat proyek github bernama knockthrough.js untuk membantu memvisualisasikan kesalahan ini.
https://github.com/JonKragh/knockthrough
Ini menyoroti kesalahan yang mengikat dan memberikan dump datacontext pada node itu.
Anda dapat bermain dengan sampel di sini: http://htmlpreview.github.io/?https://github.com/JonKragh/knockthrough/blob/master/default.htm
Terima kasih atas RP Niemeyer untuk sampel kode Knockout yang luar biasa pada SO untuk membawa saya ke titik ini.
sumber
Cara termudah untuk melihat data apa yang diteruskan ke pengikatan adalah dengan menjatuhkan data ke konsol:
Knockout akan mengevaluasi nilai untuk pengikatan teks (pengikatan apa pun sebenarnya dapat digunakan di sini ) dan mem-flush $ data ke konsol panel browser.
sumber
Semua jawaban lain akan bekerja dengan baik, saya hanya menambahkan apa yang ingin saya lakukan:
Dalam pandangan Anda (dengan asumsi Anda sudah terikat ViewModel):
Kode KO:
Ini akan menjeda kode dalam debugger, dan
element
danvalueAccessor()
akan berisi informasi berharga.sumber
Jika Anda mengembangkan di Visual studio dan IE saya suka ini lebih
data-bind="somebinding:(function(){debugger; return bindvalue; })()"
saya menyukainya lebih dari itu fungsi gema karena itu akan pergi ke script dengan semua ikatan bukan file eval dan Anda bisa melihat $ konteks $ data (saya menggunakan ini di Chrome juga);sumber
Ini bekerja untuk saya:
sumber