根据Knockout's documentation,可以使用pureComputed
来验证输入字段。
当将observable绑定到数组(或observableArray)中的那些输入字段时,似乎遇到了麻烦。
this["values"] = []; // ko.observableArray([]);
并填充此数组......
for(var $x=0; someArray[$x]!=undefined ;$x++){
this["values"][$x]= ko.observable(someArray[$x]).extend(numeric: 0);
}
输入字段由KO的foreach生成,有点像这样:
<Table>
<!-- ko foreach: generate_series( 1, field_Proyecto() ) -->
<Tr><Td data-bind="text: 'Quota number: '+$data+':'"></Td>
<Td><Input Type="Text" Class="form-control" data-bind="textInput: $root.fee_temp_data[$index()]"></Td></Tr>
<!-- /ko -->
</Table>
使用Knockout提供的示例“数字”扩展器,输入保持为“0”并且不执行任何更改。
使用它,输入被强制为数字,但是当用户键入非数字字符时,数组中的所有值都变为空(“”)。
ko.extenders.numeric = function(target, option) {
var to_number = ko.pureComputed({
read: target,
write: function(newValue){
var current = target();
$new = newValue.replace(/[\d]/ig, "");
console.log($new);
//$new = parseInt($new);
//$new = $new.formatMoney(0, ".", ",");
target( $new );
}
}).extend({ notify: "always" });
to_number( target() );
return to_number;
};
此外,“^\d
”用于匹配非数字,但是,正如您所看到的,我使用\d
并且代码匹配数字(事实上,您将看到控制台日志提供整数时的void值,但它将在输入字段中输出整数值。
generate_series
只是输出一个数组,给定一个范围,这也是初始化所述observableArray的真实函数。
this["generate_series"] = function($a, $b){
this["fee_temp_data"] =[];
this["fee"]( this["fees"][$b] );
for(var $x=$a, $out=[];$x<=this["fees"][$b];$x++) {
$out.push($x);
this["fee_temp_data"].push( ko.observable("").extend( {numeric: ""} ) );
}
return $out;
};
Here is a jsfiddle来描述我的问题。
答案 0 :(得分:1)
你在to_number
的定义中打电话给numeric
,这是一个搞砸的事情。我已经制作了一个更新的小提示,删除非数字并更新目标或通知订阅者(根据文档页面):http://jsfiddle.net/4r1nv1ft/2/