Maison >interface Web >js tutoriel >Compétences de méthode de création de liaison personnalisée Knockout_javascript
Aperçu
En plus des types de liaison intégrés de KO répertoriés dans l'article précédent (tels que valeur, texte, etc.), vous pouvez également créer des liaisons personnalisées.
Enregistrez votre gestionnaire de liaison
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. } };
Ensuite, vous pouvez utiliser une liaison personnalisée sur n'importe quel élément dom :
<div data-bind="yourBindingName: someValue"> </div>
Remarque : vous n'êtes pas obligé de fournir à la fois les rappels init et update dans votre gestionnaire, vous pouvez fournir l'un ou l'autre.
mettre à jour le rappel
Comme son nom l'indique, lorsque votre attribut de surveillance observable est mis à jour, ko appellera automatiquement votre rappel de mise à jour.
Il a les paramètres suivants :
élément : utilisez cet élément dom lié
valueAccessor : la valeur de l'attribut de modèle actuellement lié peut être obtenue en appelant valueAccessor(). L'appel de ko.unwrap(valueAccessor()) peut obtenir plus facilement la valeur observable et la valeur ordinaire ;
;
;
.
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>
init rappel
;
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(); } };
<p>Name: <input data-bind="hasFocus: editingName" /></p> <!-- Showing that we can both read and write the focus state --> <div data-bind="visible: editingName">You're editing the name</div> <button data-bind="enable: !editingName(), click:function() { editingName(true) }">Edit name</button> <script type="text/javascript"> var viewModel = { editingName: ko.observable() }; ko.applyBindings(viewModel); </script>