2017-06-14 3 views
6

Ich habe einen benutzerdefinierten Validator, der überprüft, ob ein Eingabefeld eine Nummer eingegeben hat. enter image description hereAngular 2 benutzerdefinierte Validierung für Zahlen und Dezimalwerte

Der Code sieht so aus:

import { AbstractControl, ValidatorFn } from '@angular/forms'; 

export class NumberValidators { 

    static isNumberCheck(): ValidatorFn { 
    return (c: AbstractControl): {[key: string]: boolean} | null => { 
     if (c.value !== undefined && (isNaN(c.value))) { 
     return { 'value': true }; 
     } 

     return null; 
    }; 
    } 
} 

Aber die Frage, die ich habe, ist, wenn ich ein Dezimalwert eingeben, wird es den Validierungs-Flag erhöhen, die ich nicht wollen. Ich möchte, dass das Eingabefeld ganze Zahlen und Dezimalzahlen hat. Kann mir bitte jemand helfen, das richtig zu machen?

unter meinem Template-Code ist parsleyjs für die Validierung

<div class="form-group row"> 
 
       <label for="upperbeltposition" class="col-md-6 col-form-label">Upper Belt Position (mm) <span class="required">*</span></label> 
 
       <div class="col-md-5"> 
 
       <input class="form-control input-transparent " id="upperbeltposition" type="text" formControlName="upperbeltposition" data-parsley-trigger="blur" 
 
        required="required" data-parsley-type="number"/> 
 
       </div> 
 
      </div> 
 
      <div class="form-group row"> 
 
       <label for="platformxposition" class="col-md-6 col-form-label">Platform X Position (mm) <span class="required">*</span></label> 
 
       <div class="col-md-5"> 
 
       <input class="form-control input-transparent " id="platformxposition" type="text" formControlName="platformxposition" data-parsley-trigger="blur" 
 
        required="required" data-parsley-type="number"/> 
 
       </div> 
 
      </div> 
 
      <div class="form-group row"> 
 
       <label for="platformyposition" class="col-md-6 col-form-label">Platform Y Position (mm) <span class="required">*</span></label> 
 
       <div class="col-md-5"> 
 
       <input class="form-control input-transparent " id="platformyposition" type="text" formControlName="platformyposition" data-parsley-trigger="blur" 
 
        required="required" data-parsley-type="number"/> 
 
       </div> 
 
      </div>

und in meiner Komponente I Reactive Form bin mit und unten ist mein Code

upperbeltposition: ['', [Validators.required, NumberValidators.isNumberCheck]], 
 
platformxposition: ['', [Validators.required, NumberValidators.isNumberCheck]], 
 
platformyposition: ['', [Validators.required, NumberValidators.isNumberCheck]]

danke !!

+0

Es gibt eine ausführliche Beschreibung über die Verwendung von NaN hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN Etwas kann da sein sei hilfreich. Und gemäß dieser Referenz sollte isNaN für Dezimalwerte false zurückgeben. – DeborahK

+0

Also, ich muss das isNaN entfernen, um ganze Zahlen und Dezimalzahlen zu ermöglichen – ZAJ

Antwort

5

So etwas sollte funktionieren

import { AbstractControl, ValidatorFn } from '@angular/forms'; 

export class NumberValidators { 

    static isNumberCheck(): ValidatorFn { 
    return (c: AbstractControl): {[key: string]: boolean} | null => { 
     let number = /^[.\d]+$/.test(c.value) ? +c.value : NaN; 
     if (number !== number) { 
     return { 'value': true }; 
     } 

     return null; 
    }; 
    } 
} 
+0

Nein, es funktioniert nicht, wenn ich einen Dezimalwert wie 1.1655 eingeben – ZAJ

+0

Überprüfen Sie diese jsfiddle, es funktioniert perfekt, https://jsfiddle.net/svLeh6m9/. Haben Sie das '+' Zeichen vor 'c.value' weggelassen? – Dummy

+0

hat es mit den Parselyjs zu tun, die ich in meiner html-Datei habe 'Data-Petersilie-type = "Nummer"' – ZAJ

3

ng-Muster Validierung

ng-pattern="^[0-9]+(.[0-9]{0,2})?$" 

verwenden können, können Sie bitte einmal überprüfen, wie diese

<label for="upperbeltposition" class="col-md-6 col-form-label" name="number">Upper Belt 
    Position (mm) 
     <span class="required">*</span> 
    </label> 
    <div class="col-md-5"> 
    <input class="form-control input-transparent " id="upperbeltposition" type="text" formControlName="upperbeltposition" data-parsley-trigger="blur" 
    required="required" data-parsley-type="number"/> 
<span ng-show="submitForm &&platformxposition 
    .number.$error.pattern">This value should be a valid number 
</span> 

    </div> 

Sie Ihre Formularnamen hinzufügen. und den Namen des Eingabefeldes. $ error.pattern

Verwandte Themen