Подтвердить что ты не робот

Как очистить входной файл от Angular JS

В AngularJS я использую описанный здесь подход для обработки типа ввода = файла.

Разметка:

<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 или что-то, чтобы найти элемент ввода и очистить его, но надеялся на что-то более элегантное.

4b9b3361

Ответ 1

Я бы определенно использовал директиву для такого рода задач.

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

Примечание: для создания элемента используется jquery.

Ответ 2

После успешной загрузки я четко очищу элементы типа входного типа от моего контроллера, например:

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

Селектор input[type='file'] требует jQuery, но все остальное является простым Angular.

Ответ 3

мое решение без использования $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
    };
}]);

Ответ 4

Это может помочь вам!

Пример кода HTML

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

Ответ 5

Вы можете использовать поле ID в reset.

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

Вышеприведенный пример полезен для меня. Будет работать и для вас.