2

我正在尝试将此 jquery颜色选择器与 knockout.js 一起使用。我已经编写了自定义绑定处理程序来将颜色选择器输入控件与我的 viewModel 颜色值绑定。

这是绑定处理程序代码:

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);        
}

和 HTML:

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

问题是,当我更改颜色时,每次更改颜色时都会创建多个 div,如图所示。

在此处输入图像描述

谁能确定我的代码中有什么问题?

4

2 回答 2

4

这是 jQuery ColorPicker 绑定处理程序的更新代码(与 knockout.js 库一起使用)。

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();        
  }
};
于 2012-12-17T07:43:03.337 回答
0

在您的更新代码中,您正在有效地创建新的颜色选择器。

当颜色发生变化时,会调用更新函数并在那里创建一个新的选择器。如果你尝试 ' $(element).colorPicker("value", value); ' 在 firebug 中,你会看到它不是一个 setter,而是一个构造函数。

于 2012-10-12T14:26:50.617 回答