2013-02-26 36 views
21

Trong AngularJS, tôi đang sử dụng cách tiếp cận được mô tả ở đây để xử lý kiểu đầu vào = tệp.Cách xóa đầu vào tệp từ Angular JS

Markup:

<div ng-controller="MyCtrl"> 
    <input type="file" onchange="angular.element(this).scope().setFile(this)"> 
    {{theFile.name}} 
</div> 

Bộ điều khiển:

var myApp = angular.module('myApp', []); 

myApp.controller('MyCtrl', function($scope) { 
    $scope.setFile = function(element) { 
     $scope.$apply(function($scope) { 
      $scope.theFile = element.files[0]; 
     }); 
    }; 
}); 

Như đã đề cập đó là một chút của một hack, nhưng nó MOS tly làm việc cho mục đích của tôi. Những gì tôi cần tuy nhiên là một cách để xóa các tập tin đầu vào sau khi tải lên đã hoàn thành - tức là: từ bộ điều khiển.

Tôi hoàn toàn có thể hack nó và sử dụng jQuery hoặc một cái gì đó để tìm phần tử đầu vào và xóa nó, nhưng đã hy vọng cho một cái gì đó thanh lịch hơn một chút.

Trả lời

11

Tôi chắc chắn sẽ sử dụng chỉ thị cho loại nhiệm vụ này.

http://plnkr.co/edit/xLM9VX

app.directive('fileSelect', function() { 
    var template = '<input type="file" name="files"/>'; 
    return function(scope, elem, attrs) { 
    var selector = $(template); 
    elem.append(selector); 
    selector.bind('change', function(event) { 
     scope.$apply(function() { 
     scope[ attrs.fileSelect ] = event.originalEvent.target.files; 
     }); 
    }); 
    scope.$watch(attrs.fileSelect, function(file) { 
     selector.val(file); 
    }); 
    }; 
}); 

lưu ý: nó được sử dụng jquery để tạo yếu tố.

+0

Tuyệt. Vấn đề duy nhất tôi nhận thấy là sau khi chọn tệp, có lỗi trong nhật ký bảng điều khiển về phần tử HTML không hợp lệ trong phạm vi. $ Chức năng đồng hồ. (Chạy trong Chrome) –

+2

Cách khắc phục là thay đổi "selector.val (file);" đến "if (file == null) selector.val (tệp);" –

32

Upon a upload thành công, tôi làm sáng tỏ các yếu tố tập tin loại đầu vào một cách rõ ràng từ bộ điều khiển của tôi, như vậy:

angular.forEach(
    angular.element("input[type='file']"), 
    function(inputElem) { 
     angular.element(inputElem).val(null); 
    }); 

Bộ chọn input[type='file'] đòi hỏi jQuery, nhưng mọi thứ khác là đồng bằng góc.

+13

Bạn thực sự không nên thực hiện thao tác DOM trong bộ điều khiển. Đây là những chỉ thị dành cho. – Soviut

+0

Điều này không hiệu quả đối với tôi. Nếu tôi thử và chọn lại cùng một tệp, thì onchange sẽ không được kích hoạt. Bất kỳ ý tưởng? – tomasmcguinness

+0

Điều này làm việc tốt cho tôi.Vì một số lý do, tôi không thể thực hiện công việc chỉ thị được chấp nhận (có thể do lỗi của tôi vì tôi có nhiều thứ hơn trong thẻ đầu vào). – newman

5

giải pháp của tôi mà không cần sử dụng phạm vi $.

app.directive('fileChange',['UploadService',function (UploadService) { 
    var linker = function (element, attrs) { 
     element.bind('change', function (event) { 
      var files = event.target.files; 
      UploadService.upload({'name':attrs['name'],'file':files[0]}); 
      element.val(null); // clear input 
     }); 
    }; 
    return { 
     restrict: 'A', 
     link: linker 
    }; 
}]); 
+1

đây phải là câu trả lời tốt nhất. ngắn và thanh lịch. Tự hỏi tại sao sử dụng một bộ chọn trong chỉ thị khi chúng ta có mối liên kết. – Hao

5

Nó có thể giúp bạn !!

HTML code mẫu

<input type="file" id="fileMobile" file-model="myFile"> 
<button type="button" class="btn btn-danger" id="i-agree" ng-click="uploadFile()"> Upload </button> 

AngularJs mẫu mã

$scope.uploadFile = function() { 
    var file = $scope.myFile; 
    mobileService.uploadBulkFile(file).then(function (resp) { 
     if (resp !== undefined) { 
      $('#fileMobile').val(''); 
     } 
    }); 
}; 
+0

Làm việc cho tôi – Jamsheer

0

Bạn có thể sử dụng ID để thiết lập lại sân tập.

<div class="col-md-8"> 
    <label for="files">Select File</label> 
    <input type="file" id="file_upload" class="form-control"> 
</div> 

Sau khi tải lên, hãy xóa nó.

var fileElement = angular.element('#file_upload'); 
angular.element(fileElement).val(null); 

Ví dụ trên làm việc tốt cho tôi. Sẽ làm việc cho bạn quá.

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