我有一个包含大量变量的工作视图模型。
我在文本框中使用autoNumeric(http://www.decorplanit.com/plugin/)进行文本格式化。我想在计算的observable中使用输入字段的观察数据,但是如果具有格式的可观察文本字段被修改,格式也会保存在变量中。
如何在没有格式化的情况下观察输入字段的值?
我认为最好的方法可能是observable的getter / setter,并在设置值时删除格式。我无法在knockout文档中找到为ko.observable()编写get / set方法的解决方案,而ko.computed()无法存储值。
我不想使用隐藏字段或额外变量 如果没有它,这可能吗?
答案 0 :(得分:3)
解决方案,如http://knockoutjs.com/documentation/extenders.html
所示ko.extenders.numeric = function(target, precision) {
//create a writeable computed observable to intercept writes to our observable
var result = ko.computed({
read: target, //always return the original observables value
write: function(newValue) {
var current = target(),
roundingMultiplier = Math.pow(10, precision),
newValueAsNum = isNaN(newValue) ? 0 : parseFloat(+newValue),
valueToWrite = Math.round(newValueAsNum * roundingMultiplier) / roundingMultiplier;
//only write if it changed
if (valueToWrite !== current) {
target(valueToWrite);
} else {
//if the rounded value is the same, but a different value was written, force a notification for the current field
if (newValue !== current) {
target.notifySubscribers(valueToWrite);
}
}
}
});
//initialize with current value to make sure it is rounded appropriately
result(target());
//return the new computed observable
return result;
};
后来
function AppViewModel(one, two) {
this.myNumberOne = ko.observable(one).extend({ numeric: 0 });
this.myNumberTwo = ko.observable(two).extend({ numeric: 2 });
}
答案 1 :(得分:1)
您可以使用ko.computed()。您可以指定写入选项,请参阅Writeable computed observables
示例(取自淘汰文档):
function MyViewModel() {
this.price = ko.observable(25.99);
this.formattedPrice = ko.computed({
read: function () {
return '$' + this.price().toFixed(2);
},
write: function (value) {
// Strip out unwanted characters, parse as float, then write the raw data back to the underlying "price" observable
value = parseFloat(value.replace(/[^\.\d]/g, ""));
this.price(isNaN(value) ? 0 : value); // Write to underlying storage
},
owner: this
});
}
ko.applyBindings(new MyViewModel());