Ikhtisar
Selain daripada jenis pengikatan terbina dalam KO yang disenaraikan dalam artikel sebelumnya (seperti nilai, teks, dsb.), anda juga boleh membuat pengikatan tersuai.
Daftarkan pengendali pengikat anda
ko.bindingHandlers.yourBindingName = { init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { // This will be called when the binding is first applied to an element // Set up any initial state, event handlers, etc. here }, update: function(element, valueAccessor, allBindings, viewModel, bindingContext) { // This will be called once when the binding is first applied to an element, // and again whenever any observables/computeds that are accessed change // Update the DOM element based on the supplied values here. } };
Seterusnya anda boleh menggunakan ikatan tersuai pada mana-mana elemen dom:
<div data-bind="yourBindingName: someValue"> </div>
Nota: Anda tidak perlu menyediakan panggilan balik init dan kemas kini dalam pengendali anda, anda boleh menyediakan salah satu.
kemas kini panggilan balik
Seperti namanya, apabila atribut pemantauan anda boleh diperhatikan dikemas kini, ko akan memanggil balik panggilan balik kemas kini anda secara automatik.
Ia mempunyai parameter berikut:
elemen: gunakan elemen dom terikat ini;
allBindings: Semua nilai atribut terikat pada model pada elemen dom ini, contohnya, panggil callBindings.get('name') untuk mengembalikan nilai atribut nama terikat (jika ia tidak wujud, kembalikan tidak ditentukan), atau panggil allBindings.has(' name') menentukan sama ada nama terikat pada dom semasa;
viewModel : Dihentikan dalam Knockout.3x, anda boleh menggunakan bindingContext.$data atau bindingContext.$rawData untuk mendapatkan viewModel semasa
bindingContext: Mengikat konteks, anda boleh memanggil bindingContext.$data, bindingContext.$parent, bindingContext.$parents, dsb. untuk mendapatkan data
Lihat contoh seterusnya Anda mungkin mahu menggunakan ikatan boleh dilihat untuk mengawal keterlihatan elemen dan menambah kesan animasi. Dalam kes ini, anda boleh membuat pengikatan tersuai anda:
ko.bindingHandlers.slideVisible = { update: function(element, valueAccessor, allBindings) { // First get the latest data that we're bound to var value = valueAccessor(); // Next, whether or not the supplied model property is observable, get its current value var valueUnwrapped = ko.unwrap(value); // Grab some more data from another binding property var duration = allBindings.get('slideDuration') || 400; // 400ms is default duration unless otherwise specified // Now manipulate the DOM element if (valueUnwrapped == true) $(element).slideDown(duration); // Make the element visible else $(element).slideUp(duration); // Make the element invisible } };
<div data-bind="slideVisible: giftWrap, slideDuration:600">You have selected the option</div> <label><input type="checkbox" data-bind="checked: giftWrap" /> Gift wrap</label> <script type="text/javascript"> var viewModel = { giftWrap: ko.observable(true) }; ko.applyBindings(viewModel); </script>
ko akan memanggil fungsi init anda untuk setiap elemen dom yang menggunakan pengikatan, ia mempunyai dua tujuan utama:
(1) Tetapkan keadaan permulaan untuk elemen dom;
ko.bindingHandlers.slideVisible = { init: function(element, valueAccessor) { var value = ko.unwrap(valueAccessor()); // Get the current value of the current property we're bound to $(element).toggle(value); // jQuery will hide/show the element depending on whether "value" or true or false }, update: function(element, valueAccessor, allBindings) { // Leave as before } };
ko.bindingHandlers.hasFocus = { init: function(element, valueAccessor) { $(element).focus(function() { var value = valueAccessor(); value(true); }); $(element).blur(function() { var value = valueAccessor(); value(false); }); }, update: function(element, valueAccessor) { var value = valueAccessor(); if (ko.unwrap(value)) element.focus(); else element.blur(); } };