我读了很多教程,但我不知道该怎么做,这就是输入
input(type="text",name="price",id="price"data-bind="text: price,valueUpdate:['afterkeydown','propertychange','input']")
这是我的viewModel
price: ko.computed(function()
{
return parseFloat(this.replace(' ','').replace(/[^0-9\.]+/g,"")) || '';
},this)
但这导致错误:这没有方法替换?如何将价格值传递给计算出的函数?
发布于 2013-06-12 15:46:14
最好创建自定义绑定http://knockoutjs.com/documentation/custom-bindings.html,它只接受允许的字符0-9,。作为数字表示。
将此行放入您的视图中
<input id="text" type="text" data-bind="numeric, value: number">
将这一行放入您的模型中(记住将number绑定为可观察的属性)
ko.bindingHandlers.numeric = {
init: function (element, valueAccessor) {
$(element).on("keydown", function (event) {
// Allow: backspace, delete, tab, escape, and enter
if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
// Allow: Ctrl+A
(event.keyCode == 65 && event.ctrlKey === true) ||
// Allow: . ,
(event.keyCode == 188 || event.keyCode == 190 || event.keyCode == 110) ||
// Allow: home, end, left, right
(event.keyCode >= 35 && event.keyCode <= 39)) {
// let it happen, don't do anything
return;
}
else {
// Ensure that it is a number and stop the keypress
if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
event.preventDefault();
}
}
});
}
};
发布于 2018-02-15 22:07:16
我也遇到过类似的问题。
我还需要确保INTER值只适用于IE9和up (所以type=numberical是不够的),而且由于我们有很多国际客户,我也不能依赖键码,所以我最终得到了以下结果:
//In my js class method (self is this as usual)
self.ensureNumberical = function (data, e) {
var keyValue = e.key;
if (keyValue.match(/[0-9]/g)) {
return true;
}
return false;
}
//In my MVC View
data-bind="event: { keypress: ensureNumberical }"
发布于 2014-09-26 06:53:30
另一种方法:我发现Knockout与jQuery-validate结合使用效果很好。您只需确保在尝试使用数值之前验证表单。
假设您有一个表单DOM元素,可以通过以下方式设置验证规则
$(".yourform").validate({
rules: {
year: {
digits: true,
minlength: 4,
maxlength: 4
}
},
messages: {
year: "Please enter four digits (e.g. 2009).",
}
});
在视图模型中,您可以像往常一样设置双向绑定,例如通过self.year = ko.observable("")
。现在,确保在进一步处理self.year()
之前调用$(".yourform").valid()
。在我的例子中,我做的是var year = parseInt(self.year(), 10)
。在表单验证之后,预计这将始终产生有意义的结果。
https://stackoverflow.com/questions/17048468
复制相似问题