Knockout绑定不适用于输入类型=" text"

时间:2014-10-23 15:00:01

标签: knockout.js

我正在使用以下绑定:

ko.bindingHandlers.numericText = {
        update: function (element, valueAccessor, allBindingsAccessor) {

            var value = ko.utils.unwrapObservable(valueAccessor()),
                precision = ko.utils.unwrapObservable(allBindingsAccessor().precision) || ko.bindingHandlers.numericText.defaultPrecision,
                formattedValue = value.toFixed(precision);

            console.log(formattedValue);
            ko.bindingHandlers.text.update(element, function () { return formattedValue; });
        },
        defaultPrecision: 1
    };

和这个html

      <input id="Price0" data-bind="numericText: price, valueUpdate:'afterkeydown'">
        <input id="Price1" data-bind="numericText: price(), valueUpdate:'afterkeydown'">
        <input id="Price2" data-bind="value: price, valueUpdate:'afterkeydown'">
        <input id="Price3" data-bind="text: price, valueUpdate:'afterkeydown'">
        1:<span data-bind="text: price"></span>&nbsp;
        2:<span data-bind="text: price()"></span>&nbsp;

现在它确实适用于跨度,但不适用于输入类型=文本(price0和price1)

我想在我的viewmodel和文本框之间创建一个双向绑定,这是我的try-process的第一部分。

当我更新viewmodel时,会更新跨度,但不会更新price0和price1

1 个答案:

答案 0 :(得分:1)

这是因为您在所创建的text绑定中使用了numericText绑定。该绑定不适用于输入元素。您需要使用value绑定代替那些。

编辑:

我不确定您是否可以在绑定中使用值绑定。以下是工作值样式绑定的示例:

ko.bindingHandlers.ValueStyle = {
    init: function(element, valueAccessor) {
      //update value on vm when box is changed
      $(element).on("change.koBinding", function() {
        var curStr, curVal;
        curVal = valueAccessor();
        curStr = $(element).val();
        curVal(/*put whatever you want the vm to update to here*/);
      });

      //on disposal of binding
      return ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
        return $(element).off("change.koBinding");
      });
    },
    update: function(element, valueAccessor) {
      // your formatting code here
      return $(element).val(formatted result);
    }
  };