数组& pureComputed值

时间:2015-05-14 15:04:43

标签: javascript arrays knockout.js

根据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来描述我的问题。

1 个答案:

答案 0 :(得分:1)

你在to_number的定义中打电话给numeric,这是一个搞砸的事情。我已经制作了一个更新的小提示,删除非数字并更新目标或通知订阅者(根据文档页面):http://jsfiddle.net/4r1nv1ft/2/