2013-04-25 34 views
20

Tôi có quyền kiểm soát tải lên tệp trong biểu mẫu của mình. Tôi đang sử dụng JS Angular. Khi tôi đặt thuộc tính bắt buộc để xác nhận rằng tệp được chọn, nó sẽ không hoạt động.Thuộc tính bắt buộc Không hoạt động với Đầu vào tệp trong 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> 

Bạn có thể vui lòng cho biết lý do yêu cầu không hoạt động?

Trả lời

38

Đó là số ngModelController xác thực trong Góc dựa trên các thuộc tính như require. Tuy nhiên, hiện tại không có hỗ trợ cho input type="file" với dịch vụ ng-model. Để có được nó làm việc bạn có thể tạo ra một chỉ thị như thế này: đánh dấu

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

Ví dụ:

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

Check-out my working plnkr example.

+1

sẽ làm việc này trên IE 8 trở lên? – Moiz

+0

Có, nếu bạn làm theo hướng dẫn tức thì góc http://docs.angularjs.org/guide/ie – joakimbl

+0

Tôi đã bao gồm SHIV cho IE. Tôi sẽ đặt code.will này làm việc? – Moiz

9

Mở rộng đang @joakimbl tôi sẽ đề xuất trực tiếp như thế này

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

và trong html bạn có thể sử dụng như thế này

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

Đó là loại kỳ quặc, nhưng sử dụng mã của bạn đúng cách đặt 'myForm.myFile. $ Error.validFile' thành true, nhưng ng-show không hoạt động. Sử dụng 'myForm.myFile. $ Invalid' đang hoạt động đúng cách. Tôi không hiểu vì sao. Thanh tra góc của tôi hiển thị validFile là true ... –

+1

OK, tôi hiểu rồi ... tôi đã thay đổi validFile thành tệp hợp lệ và tôi đang tìm 'myForm.myFile. $ Error.valid' trừ' tệp' –

Các vấn đề liên quan