2016-08-30 3 views
1

Я создал Josh Moroney's tutorial при создании пользовательского валидатора. Я получил это работает, будучи в состоянии назватьПользовательские валидаторы. Передача аргумента

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 
    } 

} 

}

Можно ли добавить аргумент в метод .ageIsValid, чтобы я мог указать возраст, который действителен? Например,

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

То, что я пробовал:

1) Избавление от static и использования .ageIsValid как anyother метод. Результат: Ошибка TS

2) Передача аргумента, как указано выше. Результат: Ошибка

Что-нибудь еще я могу попробовать?

ответ

1

Вы можете использовать класс с помощью метода экземпляра (вместо статического)

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)]) 
); 

или функции, которая возвращает функцию

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

Execellent! Я пошел на второй вариант. Первый дал мне кучу ошибок («Не могу найти контроль»). Второй вариант, похоже, работает для меня сейчас. Мои вопросы только в том, почему вам не нужно включать 'AgeValidator' при вызове метода? Спасибо за вашу помощь! –

+0

Я также предпочитаю второй. Я обновил первый. Таким образом, он также должен работать, если вы используете 'this' внутри' ageIsValid() '. Я точно не знаю, что вызвало вашу ошибку. –

+0

Другое, что мне нужно было сделать, это добавить ракету после 'ValidationResult' в ваш второй ответ. 'ValidationResult => { // использование someParam здесь }' В противном случае TS дал мне ошибку. –

Смежные вопросы