Search code examples
jqueryknockout.jscolor-picker

Jquery color picker binding handler creates multiple divs


I am trying to use this jquery color picker with knockout.js. I have written custom banding handler to bind colorpicker input control with my viewModel color value.

Here is the Binding Handler code:

ko.bindingHandlers.colorPicker = {
init: function (element, valueAccessor, allBindingsAccessor) {

    //initialize datepicker with some optional options
    var options = allBindingsAccessor().colorPickerOptions || {};
    $(element).colorPicker(options);

    //handle the field changing
    ko.utils.registerEventHandler(element, "change", function () {
        var observable = valueAccessor();
        observable($(element).colorPicker("value"));
    });

    //handle disposal (if KO removes by the template binding)
    ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
        $(element).colorPicker("destroy");
    });

},
update: function (element, valueAccessor) {
    var value = ko.utils.unwrapObservable(valueAccessor());       
    $(element).colorPicker("value", value);        
}

and HTML :

 <input type="text" data-bind="colorPicker: newEvent().color, colorPickerOptions: { value:newEvent().color }"/>

Problem is that when I change the color it creates the multiple divs each time when I change the color as shown in image.

enter image description here

Can anyone please identiy whats the problem in my code??


Solution

  • Here is the updated code for jQuery ColorPicker binding handler (to used with knockout.js libraray).

    ko.bindingHandlers.jqColorPicker = {
      init: function (element, valueAccessor, allBindingsAccessor) {
    
        // set default value
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).val(value);
    
        //initialize datepicker with some optional options
        var options = allBindingsAccessor().colorPickerOptions || {};
        $(element).colorPicker(options);
    
        //handle the field changing
        ko.utils.registerEventHandler(element, "change", function () {            
            var observable = valueAccessor();            
            observable($(element).val());                        
        });
    
        //handle disposal (if KO removes by the template binding)
        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            $(element).colorPicker("destroy");
        });
    
      },
      update: function (element, valueAccessor, allBindingsAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).val(value);        
        $(element).change();        
      }
    };