2016-10-11 4 views
0

Ich arbeite an einer Webanwendung mit knockout.js und knockout validation.Wie konfiguriere ich die Nummernlokalisierung für die Knockout-Validierung?

Ich habe eine Ansicht Modell wie folgt aus:

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; 
    } 
} 

Auf Front-End, wenn ich versuche, eine Zahl mit Dezimaltrennzeichens zu speichern Komma anstelle eines Punktes meine speichern Funktion false zurück.

Zum Beispiel: Wenn PROP1 haben „1.2“ Wert der speichern richtig funktionieren anders funktionieren, wenn PROP1 „1,2“ Wert haben die speichern Funktion false zurück.

Können Sie mir bitte helfen?

Sie

+0

Haben Sie die Lokalisierung Dokumentation für Knockout Validation aus? https://github.com/Knockout-Contrib/Knockout-Validation/wiki/Localization –

+0

Hallo Steve, ich habe die Dokumentation gelesen, aber es geht um "die Validierungsnachrichten in mehreren Sprachen anzeigen" ... – ilMattion

+0

Können Sie teilen Code der 'Nummer' Erweiterung? Es ist kein Standard von knockout.js, oder? – user3297291

Antwort

0

Hier ist der source für den number Extender viel Vielen verwenden Sie:

// 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.' 
}; 

ich kein regexp Experte bin, aber es sieht so aus „“ getrennte Zahlen nur unterstützt werden wenn sie 3 Ziffern trennen. Ie .: Sie können Kommas nicht verwenden, um einen Dezimalpunkt zu markieren.

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"))

könnten Sie einen anderen Extender hinzufügen , Zeichen zu entfernen, wenn eingegebenen Werte getestet werden, um die Muster nicht überein. Nicht sicher, ob es eine gute Idee ist.

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

Hallo, das Problem ist, dass im italienischen Zahlenformat Dezimalzahlen durch ein Komma und nicht durch einen Punkt getrennt sind, so dass ich das Komma nicht entfernen kann. Basierend auf Ihrer Antwort könnte eine mögliche Lösung den Regular-Ausdruck ändern. – ilMattion

+1

Mit der Knockout-Validierung können Sie benutzerdefinierte Regeln implementieren. Sie müssen also die 'number' Regel nicht überschreiben, um Ihre eigene Anpassung zu implementieren: https://github.com/Knockout-Contrib/Knockout-Validation/wiki/User-Contributed-Rules#example-rule – user3297291

Verwandte Themen