2016-01-21 18 views
13

ngControl con un valore di new Control('', Validators.required) non ha funzionato anche quando il file è valido.Come posso convalidare <input type = "file"> con Angular2?

(e in realtà, ho trovato difficoltà a convalidare pulsanti di opzione, nonché ...)

+1

auto-risolto. ** ** html '' ** ** ts 'controlName.updateValue (valore)' (valore è impostato via FileReader) –

+0

hey @Yusu puoi rispondere alla tua stessa domanda e fornire tutto il codice pertinente che ha funzionato per te ... ?? – hhsadiq

+0

@YuSu Puoi davvero fornire tutto il codice pertinente, perché non sono in grado di farlo come dici tu. Se provo con 'this.frm.patchValue ({file: evt.target.value});' Sto ottenendo: Impossibile impostare la proprietà 'value' su 'HTMLInputElement': questo elemento input accetta un nome file, che può solo essere programmaticamente impostato sulla stringa vuota. –

risposta

5

Validators.required dipende dal valore del campo.

Il tipo di ingresso file non ha un valore, pertanto è considerato come undefined o null.

Ecco perché non è valido. Meglio scrivere la tua convalida.

Per file personalizzato validation example refer

0

Una grande soluzione per risolvere questo problema è quello di creare un elemento personalizzato che avvolgono il vostro e implementa un ValueAccessor. In questo modo puoi creare un componente personalizzato che funziona esattamente come gli altri elementi del modulo. Invece di usare il valore di input puoi usare un'altra variabile all'interno del tuo componente.

Maggiori informazioni qui: Applying angular2 form directives to custom input form elements

1

Un esempio di validatore da utilizzare con il normale richiedono attributo potrebbe essere qualcosa di simile

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 
    } 
} 

attributo Fondamentalmente richiesta sta controllando la prima volta, questo ogni volta dopo che hai usato l'input per la prima volta, anche se rimuovi il file (che era il mio problema) perché il controllo del valore è per null. E quando è intatto è nullo, quindi si riempie quando aggiungi un file, ma se lo rimuovi è solo un array vuoto, quindi []! == null. Spero che questo aiuti a seguire questo puoi costruire il tuo tipo di convalida se necessario.

Problemi correlati