Attached is a snippet for a custom binding handler for some buttons designed to act as a radio group.
The problem I have is that when I click on a button it fires the update 6 times.
I guess I need to add either a throttle or bind differently but I am new to knockout so any help would be appreciated.
Or as it fires the same update 6 times is it not actually affecting knockout performance wise?
Just a pointer in the right direction would be fine!
ko.bindingHandlers.buttonGroupChecked = {
init: function (element, valueAccessor, allBindingsAccessor,
viewModel, bindingContext) {
if (typeof globalLog !== 'undefined' && globalLog === true){
console.log("buttonGroupInit");
}
var value = valueAccessor();
var newValueAccessor = function () {
return {
click: function () {
value($(element).data('value'));
}
}
};
ko.bindingHandlers.event.init(element, newValueAccessor,
allBindingsAccessor, viewModel, bindingContext);
},
update: function (element, valueAccessor, allBindingsAccessor,
viewModel, bindingContext) {
if ($(element).data('value') == ko.unwrap(valueAccessor())) {
//$(element).closest('.btn').button('toggle');
$(element).siblings().removeClass('btn-success').addClass('btn-info');
$(element).removeClass('btn-info').addClass('btn-success');
}
if (typeof globalLog !== 'undefined' && globalLog === true){
console.log("buttonGroupUpdate" + ko.unwrap(valueAccessor()));
}
}
}
var ViewModel = function () {
this.optionsValue = ko.observable(2);
};
globalLog = true;
var vm = new ViewModel();
ko.applyBindings(vm);
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div class="btn-group btn-group-justified">
<a href="javascript:void(0)" class="btn btn-lg btn-info" data-value="1" data-bind="buttonGroupChecked: optionsValue">1</a>
<a href="javascript:void(0)" class="btn btn-lg btn-info" data-value="2" data-bind="buttonGroupChecked: optionsValue">2</a>
<a href="javascript:void(0)" class="btn btn-lg btn-info" data-value="3" data-bind="buttonGroupChecked: optionsValue">3</a>
<a href="javascript:void(0)" class="btn btn-lg btn-info" data-value="4" data-bind="buttonGroupChecked: optionsValue">4</a>
<a href="javascript:void(0)" class="btn btn-lg btn-info" data-value="5" data-bind="buttonGroupChecked: optionsValue">5</a>
<a href="javascript:void(0)" class="btn btn-lg btn-info" data-value="5+" data-bind="buttonGroupChecked: optionsValue">5+</a>
</div>
<span data-bind="text: optionsValue"></span>