2016-08-30 3 views
1

Ich habe Josh Moroney's tutorial beim Erstellen eines benutzerdefinierten Validators gefolgt. Ich habe es funktioniert, in der Lage zu seinBenutzerdefinierte Validatoren - ein Argument übergeben

newForm.ts

new FormControl(question || '', 
      Validators.compose([AgeValidator.ageIsValid]) 
      ); 

AgeValidator.ts

interface ValidationResult { 
    [key:string]:any; 
} 

export class AgeValidator { 
static ageIsValid(control: AbstractControl): ValidationResult{ 

    console.log('this is control', control) 
    console.log('this is control.value', control.value) 

    if(isNaN(control.value)){ 

     return { 
      "notValid": true, 
      "message": "this is not a number" 
     }; 
    } 
    if(control.value % 1 !== 0){ 
     return { 
      "notValid": true, 
      "message": "cant be zero" 
     }; 
    } 

    if(control.value < 18){ 
     return { 
      "notValid": true, 
      "message": "cant be less than 18" 
     }; 
    } 
    if(control.value > 120){ 
     return { 
      "notValid": true, 
      "message": "Must be less than 120" 
     }; 
    } 
    else{ 
     return null 
    } 

} 

}

Ist es zu nennen möglich, ein Argument in .ageIsValid Methode hinzuzufügen, so dass ich das gültige Alter angeben kann? Zum Beispiel

new FormControl(question || '', 
      Validators.compose([AgeValidator.ageIsValid(18)]) 
      ); 

Was habe ich versucht:

1) von static Loswerden und wie anyother Methode .ageIsValid. Ergebnis: TS-Fehler

2) Übergeben eines Arguments wie oben. Ergebnis: Fehler

Alles andere, was ich versuchen kann?

Antwort

1

Sie können eine Klasse mit einer Instanz-Methode (statt statisch) verwenden

class AgeValidator { 
    constructor(private someParam) {} 
    ageIsValid(control: AbstractControl): ValidationResult { 
    // use someParam here 
    } 
} 
var ageValidator = new AgeValidator('foo') 
new FormControl(question || '', 
    Validators.compose([ageIsValid.ageIsValid.bind(ageValidator)]) 
); 

oder eine Funktion, die eine Funktion

static ageIsValid (someParam) { 
    return (control: AbstractControl): ValidationResult => { 
    // use someParam here 
    } 
} 
new FormControl(question || '', 
    Validators.compose([ageIsValid('foo')]) 
); 
+0

Execellent zurück! Ich ging für die zweite Option. Der erste gab mir eine Reihe von Fehlern ('Kann die Kontrolle nicht finden '). Die zweite Option scheint jetzt für mich zu funktionieren. Meine einzige Frage ist, warum brauchst du "AgeValidator" nicht beim Aufruf der Methode? Danke für deine Hilfe! –

+0

Ich bevorzuge auch die 2nd. Ich habe das erste aktualisiert. So sollte es auch funktionieren, wenn Sie 'this' in' ageIsValid() 'verwenden. Ich weiß nicht genau, was Ihren Fehler verursacht hat. –

+0

Die andere Sache, die ich tun musste, war, nach 'ValidationResult' in Ihrer zweiten Antwort eine Rakete hinzuzufügen. 'ValidationResult => { // benutze hier einigeParam }' Sonst gab TS mir einen Fehler. –