2016-10-11 36 views
0

我正在与一个网络应用程序knockout.jsknockout validation如何配置敲除验证的数字本地化?

我有这样一个视图模型:

var viewModel = { 
    prop1 : ko.observable().extend({number:true}), 
    prop2 : ko.observable().extend({number:true}), 
    prop3 : ko.observable().extend({number:true}), 
    save : function() { 
     var vmValidatable = ko.validatedObservable(viewModel); 
     if (!vmValidatable.isValid()) 
      return false; 
    } 
} 

在前端,如果我试图挽救逗号而不是一个点用小数点分隔一个号码我保存函数返回false。

例如:如果PROP1有“1.2”值保存功能工作正常否则如果PROP1有“1,2”值保存函数返回false。

你能帮助我吗?

谢谢很多

+0

您检查了淘汰赛验证本地化文档? https://github.com/Knockout-Contrib/Knockout-Validation/wiki/Localization –

+0

您好史提夫,我已阅读文档,但它谈论“以多种语言显示验证消息”... ... – ilMattion

+0

你能分享数字扩展的代码?它不是knockout.js的默认版本,是吗? – user3297291

回答

0

这里的sourcenumber扩展你使用:

// https://github.com/Knockout-Contrib/Knockout-Validation/blob/master/src/rules.js#L221 
ko.validation.rules['number'] = { 
    validator: function (value, validate) { 
    if (!validate) { return true; } 
    return ko.validation.utils.isEmptyVal(value) || 
     (validate && /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value)); 
    }, 
    message: 'Please enter a number.' 
}; 

我不是正则表达式的专家,但它看起来像“”分隔的数字只支持当他们分开3位数。 I.e .:不能使用逗号来标记小数点。

console.log(/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test("100,000")) 
 
console.log(/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test("100,000.00")) 
 
console.log(/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test("1,2")) 
 
console.log(/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test("1,200"))

你可以添加其他扩展,如果输入的值进行测试,以不匹配的模式,以除去,字符。不知道这是不是一个好主意。

var test = function(val) { 
 
    if (!val) return true; 
 

 
    return /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(val); 
 
}; 
 

 

 
ko.extenders.removeCommas = function(target, option) { 
 
    var result = ko.pureComputed({ 
 
    read: target, 
 
    write: function(newValue) { 
 
     var current = target(), 
 
     valueToWrite = test(newValue) ? newValue : newValue.replace(/,/g, 
 
      "."); 
 

 
     if (valueToWrite !== current) { 
 
     target(valueToWrite); 
 
     } else { 
 
     if (newValue !== current) { 
 
      target.notifySubscribers(valueToWrite); 
 
     } 
 
     } 
 
    } 
 
    }).extend({ 
 
    notify: 'always' 
 
    }); 
 

 
    result(target()); 
 
    return result; 
 
}; 
 

 
var ViewModel = function() { 
 
    this.input = ko.observable().extend({ 
 
    removeCommas: true 
 
    }); 
 
} 
 

 
ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 

 
<input data-bind="textInput: input" />

+0

嗨,问题是,在意大利数字格式十进制数除以逗号而不是点,所以我不能删除逗号。根据你的回答,一个可能的解决方案可能会改变regoular表达。 – ilMattion

+1

敲除验证允许您实施自定义规则。所以你不必重写'number'规则来实现你自己的适应:https://github.com/Knockout-Contrib/Knockout-Validation/wiki/User-Contributed-Rules#example-rule – user3297291