Bagaimana memaksakan penyegaran tampilan tanpa memicunya secara otomatis dari yang dapat diamati?

151

Catatan: ini sebagian besar untuk debugging dan memahami KnockoutJS.

Apakah ada cara untuk secara eksplisit meminta Knockout untuk menyegarkan tampilan dari model tampilan (yang sudah terikat)? Saya mencari sesuatu seperti:

ko.refreshView();

Saya mengerti bahwa ini bukan tujuan penggunaan Knockout, tetapi saya masih ingin tahu apakah ada metode seperti itu untuk tujuan debugging dan pembelajaran.

THX-1138
sumber

Jawaban:

252

Anda tidak dapat memanggil sesuatu di seluruh viewModel, tetapi pada individu yang dapat diamati, Anda dapat menelepon myObservable.valueHasMutated()untuk memberi tahu pelanggan bahwa mereka harus mengevaluasi ulang. Ini umumnya tidak perlu di KO, seperti yang Anda sebutkan.

RP Niemeyer
sumber
5
Anda juga dapat mengulangi konteks data, mencari elemen yang memiliki valueHasMutatedproperti yang bertipe functiondan memanggilnya untuk masing-masing. Itu harus mendapatkan semua yang dapat Anda amati, tetapi ini adalah praktik yang buruk dan dapat memicu pembaruan yang jauh lebih banyak daripada yang Anda perkirakan (pikirkan rantai ketergantungan yang dihitung).
Patrick M
Tentu akan lebih baik jika tidak ada yang lain - pengujian di chrome.
Scott Romack
Model viewM Anda sendiri dapat diamati, sehingga Anda dapat menelepon myViewModel.valueHasMutated()untuk memperbarui seluruh tampilan.
Roy J
2
Juga tidak berfungsi pada array di sini. Sebenarnya array sepertinya tidak berfungsi sama sekali di Knockout. Aku rindu Angular :-(
garryp
2
Itu berfungsi pada KnockoutObservableArrays pada KO 3.5
balint
25

Dalam beberapa keadaan mungkin berguna untuk hanya menghapus binding dan kemudian mendaftar kembali:

ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))
ProfNimrod
sumber
Terima kasih untuk edit ebram ... Tebak saya seharusnya sudah menyebutkan saya menggunakan coffeescript ;-)
ProfNimrod
15
Hati-hati jika Anda juga menggunakan jQuery (mis. Ketika memigrasi bit aplikasi ke ko) karena cleanNode juga akan menghapus acara dom lainnya.
Dan Revell
Ini sempurna. Saya tidak bisa membuat KO mengenali anak-anak dom BARU dengan atribut data-bind setelah model view telah diterapkan.
Andrew T Finnell
Sempurna! Kerja!
jeff_drumgod
0

Saya telah membuat JSFiddle dengan handler binding bindHTML mengikat saya di sini: https://jsfiddle.net/glaivier/9859uq8t/

Pertama, simpan handler yang mengikat ke dalam file sendiri (atau yang umum) dan sertakan setelah Knockout.

Jika Anda menggunakan ini, ganti binding Anda ke ini:

<div data-bind="bindHTML: htmlValue"></div>

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
James 'Fluffy' Burton
sumber