2013-04-25 6 views
20

Ho un controllo di caricamento file nel mio modulo. Sto usando Angular JS. Quando inserisco l'attributo richiesto per verificare che il file sia selezionato, non funziona.Attributo richiesto Non funziona con l'input di file in J angular

<input id="userUpload" name="userUpload" required type="file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /> 

<button type="submit" class="btn btn-primary"><i class="icon-white icon-ok"></i>&nbsp;Ok</button> 

Potete suggerire per favore perché il richiesto non funziona?

risposta

38

È lo ngModelController che esegue la convalida in Angolare in base a attributi come require. Tuttavia, attualmente non è disponibile il supporto per input type="file" con il servizio ng-model. Per farlo funzionare è possibile creare una direttiva come questa:

app.directive('validFile',function(){ 
    return { 
    require:'ngModel', 
    link:function(scope,el,attrs,ngModel){ 
     //change event is fired when file is selected 
     el.bind('change',function(){ 
     scope.$apply(function(){ 
      ngModel.$setViewValue(el.val()); 
      ngModel.$render(); 
     }); 
     }); 
    } 
    } 
}); 

Esempio di marcatura:

<div ng-form="myForm"> 
    <input id="userUpload" ng-model="filename" valid-file name="userUpload" required type="file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /> 
    <button ng-disabled="myForm.$invalid" type="submit" class="btn btn-primary"><i class="icon-white icon-ok"></i>&nbsp;Ok</button> 
    <p> 
     Input is valid: {{myForm.userUpload.$valid}} 
     <br>Selected file: {{filename}} 
    </p> 
    </div> 

Partenza my working plnkr example.

+1

sarà questo lavoro su IE 8 e superiori? – Moiz

+0

Sì, se segui la guida angolare ie http://docs.angularjs.org/guide/ie – joakimbl

+0

ho già incluso SHIV per IE. Ho intenzione di inserire questo codice.verrà questo lavoro? – Moiz

9

Estendere codice @joakimbl suggerirò la diretta come questo

.directive('validFile',function(){ 
    return { 
     require:'ngModel', 
     link:function(scope,el,attrs,ctrl){ 
      ctrl.$setValidity('validFile', el.val() != ''); 
      //change event is fired when file is selected 
      el.bind('change',function(){ 
       ctrl.$setValidity('validFile', el.val() != ''); 
       scope.$apply(function(){ 
        ctrl.$setViewValue(el.val()); 
        ctrl.$render(); 
       }); 
      }); 
     } 
    } 
}) 

e in html è possibile utilizzare in questo modo

<input type="file" name="myFile" ng-model="myFile" valid-file /> 
<label ng-show="myForm.myFile.$error.validFile">File is required</label> 
+0

È un po 'strano, ma l'uso del codice imposta correttamente 'myForm.myFile. $ Error.validFile' su true, ma ng-show non funziona. L'uso di 'myForm.myFile. $ Invalid' sta funzionando correttamente. Non capisco perché è così. Il mio ispettore angolare mostra validFile come vero ... –

+1

Ok, ho capito ... ho cambiato validFile in file valido, e stavo cercando 'myForm.myFile. $ Error.valid' minus' file' –

Problemi correlati