2013-04-25 14 views
20

Mam kontrolę przesyłania plików w mojej formie. Używam Angular JS. Po wstawieniu wymaganego atrybutu do sprawdzenia, czy plik jest zaznaczony, nie działa.Wymagany atrybut Nie działa z plikiem wejściowym w Angular Js

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

Czy możesz zasugerować, dlaczego wymagane nie działa?

Odpowiedz

38

To jest ngModelController, który dokonuje walidacji w Angular na podstawie atrybutów takich jak require. Jednak obecnie nie ma obsługi dla input type="file" z usługą ng-model. Aby dostać pracę można stworzyć dyrektywę tak:

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(); 
     }); 
     }); 
    } 
    } 
}); 

Przykład znaczników:

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

my working plnkr example wyjazdu.

+1

Będzie to działać na IE 8 i powyżej? – Moiz

+0

Tak, jeśli podążacie za kątem, tj. Http://docs.angularjs.org/guide/ie – joakimbl

+0

Zawarłem już SHIV dla IE. Zamierzam umieścić ten kod. Czy to będzie praca? – Moiz

9

Rozszerzanie kod @joakimbl będę sugerować bezpośredni jak ten

.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(); 
       }); 
      }); 
     } 
    } 
}) 

w html jak można użyć tego

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

To trochę dziwne, ale użycie twojego kodu poprawnie ustawia "myForm.myFile. $ Error.validFile" na true, ale ng-show nie działa. Użycie 'myForm.myFile. $ Invalid' działa poprawnie. Nie rozumiem, dlaczego tak jest. Mój inspektor kątowy pokazuje validFile jako prawdziwy ... –

+1

OK, dostałem to ... Zmieniłem poprawny plik na poprawny plik, a ja szukałem 'myForm.myFile. $ Error.valid' minus' plik' –

Powiązane problemy