2016-01-21 78 views
13

ngControl值爲new Control('', Validators.required)即使在文件有效時也不起作用。如何使用Angular2驗證<input type =「file」>?

(實際上,我發現它難以驗證單選按鈕,以及...)

+1

自我解決。 ** ** HTML' ' ** ** TS' controlName.updateValue(值)'(值設置通過FileReader) –

+0

嗨@Yusu你能回答你自己的問題,並提供所有相關的代碼,爲你工作......? – hhsadiq

+0

@YuSu你真的可以請提供所有相關的代碼,因爲我不能像你說的那樣去做。如果我嘗試使用'this.frm.patchValue({file:evt.target.value});'我得到:未能在'HTMLInputElement'上設置'value'屬性:這個input元素接受一個文件名,只能以編程方式設置爲空字符串。 –

回答

5

Validators.required取決於該字段的值。

輸入類型file不具有值,因此被認爲是undefinednull

這就是爲什麼它是無效的。最好寫你自己的驗證。要解決此問題

對於自定義文件validation example refer

0

一個很好的解決方案是創建您的包裹並實現ValueAccessor一個自定義元素。這樣您就可以創建一個與其他表單的元素完全相同的自定義組件。您可以使用組件內的其他變量來代替使用輸入值。

點擊此處瞭解詳情:Applying angular2 form directives to custom input form elements

1

驗證的例子與正常使用要求屬性可以是這樣的

import { Provider, forwardRef, Directive } from '@angular/core'; 
import { NG_VALIDATORS, Validator, Control } from '@angular/common'; 
export const NO_ATTACHMENT_VALIDATOR = new Provider(NG_VALIDATORS,{ 
    useExisting: forwardRef(() => noAttachmentValidator), 
    multi: true 
}); 

@Directive({ 
    selector: '[noAttachmentValidator][ngControl],[noAttachmentValidator][ngFormControl],[noAttachmentValidator][ngModel]', 
    providers: [NO_ATTACHMENT_VALIDATOR] 
}) 

export class noAttachmentValidator implements Validator{ 
    public validate(control: Control) : { required: { [key: string]: boolean } | null } { 
    let state, 
     value = control.value, 
     alreadyUsed = control.dirty; 

    if(alreadyUsed && value.length == 0){ 
     state = true; 
    } 
    return state ? { required : { 'required' : false } } : null 
    } 
} 

基本上需要屬性檢查一次,每次都是這樣之後即使您刪除了文件(這是我的問題),因此您第一次使用了輸入,導致對該值的控制爲null。當它沒有被觸動時它是空的,那麼當你添加一個文件時它會被填充,但是如果你刪除它,它只是一個空數組,所以 []!== null。我希望這有助於遵循這一點,如果需要,您可以構建自己的驗證類型。

相關問題