在AngularJS中,我使用此处描述的方法来处理input type = file。
标记:
<div ng-controller="MyCtrl">
<input type="file" onchange="angular.element(this).scope().setFile(this)">
{{theFile.name}}
</div>
控制器:
var myApp = angular.module('myApp', []);
myApp.controller('MyCtrl', function($scope) {
$scope.setFile = function(element) {
$scope.$apply(function($scope) {
$scope.theFile = element.files[0];
});
};
});
如上所述,它有点像黑客,但它主要用于我的目的。然而,我需要的是一种在上传完成后清除文件输入的方法 - 即:来自控制器。
我可以完全破解它并使用jQuery或其他东西找到输入元素并清除它,但是希望有更优雅的东西。
答案 0 :(得分:35)
成功上传后,我会从控制器中明确清除输入类型文件元素,如下所示:
angular.forEach(
angular.element("input[type='file']"),
function(inputElem) {
angular.element(inputElem).val(null);
});
input[type='file']
选择器需要jQuery,但其他一切都是简单的Angular。
答案 1 :(得分:11)
我肯定会使用指令来完成这类任务。
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);
});
};
});
注意:它正在使用jquery来创建元素。
答案 2 :(得分:9)
我的解决方案,不使用$ scope。
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
};
}]);
答案 3 :(得分:5)
它可能对你有所帮助!!
HTML code sample
<input type="file" id="fileMobile" file-model="myFile">
<button type="button" class="btn btn-danger" id="i-agree" ng-click="uploadFile()"> Upload </button>
AngularJs代码示例
$scope.uploadFile = function () {
var file = $scope.myFile;
mobileService.uploadBulkFile(file).then(function (resp) {
if (resp !== undefined) {
$('#fileMobile').val('');
}
});
};
答案 4 :(得分:1)
您可以使用ID重置文件字段。
<div class="col-md-8">
<label for="files">Select File</label>
<input type="file" id="file_upload" class="form-control">
</div>
上传后清除它。
var fileElement = angular.element('#file_upload');
angular.element(fileElement).val(null);
以上示例对我有用。也适合你。
答案 5 :(得分:0)
在我的情况下,我在文件上传成功时广播事件。 所以我的指令监视广播,并清除选择。
app.directive("fileInput", function( APP_EVENTS ){
return{
require: "ngModel",
link: function postLink( scope, elem, attrs, ngModel ){
elem.on("change", function( e ){
var files=elem[0].files;
ngModel.$setViewValue( files );
});
scope.$on( APP_EVENTS.FILE_UPLOAD_SUCCESS, function( event ){
elem.val( null );
});
}
}
});
它的使用方式如下:
<input type="file" name="myFieldName" ng-model="myModel" file-input/>