我正在使用以下绑定:
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>
2:<span data-bind="text: price()"></span>
现在它确实适用于跨度,但不适用于输入类型=文本(price0和price1)
我想在我的viewmodel和文本框之间创建一个双向绑定,这是我的try-process的第一部分。
当我更新viewmodel时,会更新跨度,但不会更新price0和price1
答案 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);
}
};