2016-08-30 105 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像任何其它方法。結果: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

我也比較喜歡2nd。我更新了第一個。這樣,如果你在'ageIsValid()'裏面使用'this',它也應該可以工作。我不知道究竟是什麼導致了你的錯誤。 –

+0

我需要做的另一件事是在第二個答案中的「ValidationResult」後添加一個火箭。 'ValidationResult => { //在這裏使用someParam }'否則TS給了我一個錯誤。 –