2017-02-20 57 views
0

我做了一個日期驗證器。它驗證現有的日期。我需要多個日期驗證器與其他限制,例如:一個最大日期驗證程序,不會讓用戶放入未來的日期或日期驗證程序只需要過去的日期。這是我目前的驗證器。適用於多種情況的可重複驗證器

export function dateValidator(group) { 

    const {day, month, year} = group.value; 
    const fullDate = `${day}/${month}/${year}`; 
    const dobPattern = /^(\d{1,2})[-\/](\d{1,2})[-\/](\d{4})$/; 
    const isStringValid = dobPattern.test(fullDate); 

    let isValid = false; 

    if (isStringValid) { 
    const intDay = Number(day); 
    const intMonth = Number(month); 
    const intYear = Number(year); 
    const jsMonth = intMonth - 1; 
    const date = new Date(intYear, jsMonth, intDay); 
    isValid = (date.getFullYear() === intYear && date.getMonth() === jsMonth && date.getDate() === intDay ; 
    } 

    return isValid ? null : { invalid: 'Invalid date' }; 
}; 

如何限制用戶放置未來的日期。 我用這個代碼以下行:

isValid = (date.getFullYear() === intYear && date.getMonth() === jsMonth && date.getDate() === intDay ; 

但我不知道是否有無需進行復制和過去的這個代碼在一個更簡單的方法,並重新做小限制它。

回答

1

dateValidator()功能應該是一個功能工廠(即返回功能的功能),而不是說直接返回該錯誤的功能:

export function dateValidator(maxDate: string): ValidatorFn { 
    // Return a validator function. 
    return (group: FormGroup): {[key: string]: any} => { 
    // Re-use your existing validation code here and return the error if any. 
    // Optionally, use the `maxDate` param to customize the validation: 
    // entered dates should not go beyond `maxDate`. 
    }; 
} 

正如你所看到的,你可以自定義驗證函數通過將參數傳遞給函數工廠。在我的例子中,我使用了一個maxDate參數來表示驗證器應該允許的最遠日期。

在您的表格模型中,通過使用適當的值調用工廠來使用此驗證器。 :

this.myForm = fb.group({ 
    'date': ['', [Validators.required(), dateValidator('02/20/2017')]] 
}); 

你可以看到一個驗證的文檔的功能工廠的另一個例子:https://angular.io/docs/ts/latest/cookbook/form-validation.html#custom-validation

+0

這是否意味着我必須複製和粘貼多個驗證碼?我對此很陌生。 – Mai

+0

不可以。如果您正確組織代碼,則不需要複製/粘貼。就像我解釋的那樣,創建一個'dateValidator'函數工廠,用你需要的所有參數來定製它的工作方式(如我的例子中的'm​​axDate')。然後在所需的所有字段中使用該驗證器,每次使用驗證器時都可能必須傳遞不同的參數。 – AngularChef

相關問題