Как запустить ng-change с помощью fileModel || тип ввода ="файл"

Как запустить ng-change, когда есть изменение с `'

Я использую пользовательскую директиву файла для этого

Директива:

app.directive('ngFileModel', ['$parse', function($parse) {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            var model = $parse(attrs.ngFileModel);
            var isMultiple = attrs.multiple;
            var modelSetter = model.assign;
            element.bind('change', function() {
                var values = [];
                angular.forEach(element[0].files, function(item) {
                    var value = {
                        // File Name 
                        name: item.name,
                        //File Size 
                        size: item.size,
                        //File URL to view 
                        url: URL.createObjectURL(item),
                        // File Input Value 
                        _file: item
                    };
                    values.push(value);
                });
                scope.$apply(function() {
                    if (isMultiple) {
                        modelSetter(scope, values);
                    } else {
                        modelSetter(scope, values[0]);
                    }
                });
            });
        }
    };
}]);

Как использовать ng-change с этим без использования ng-модели

HTML:

 <input type="file" name="" ng-file-model="uploadThisImage" ng-change="onFileSelect($index)">

1 ответ

Решение

Директива для получения файлов ввода с ng-model

Эта директива позволяет <input type=file> автоматически работать с ng-change а также ng-form директивы.

AngularJS встроенный <input> директива не обрабатывает <input type=file>, Для этого нужна специальная директива.

<input type="file" files-input ng-model="fileArray"
       ng-change="onFileSelect()" multiple />

files-input директива:

angular.module("app").directive("filesInput", function() {
  return {
    require: "ngModel",
    link: function postLink(scope,elem,attrs,ngModel) {
      elem.on("change", function(e) {
        var files = elem[0].files;
        ngModel.$setViewValue(files);
      })
    }
  }
})

Приведенная выше директива добавляет прослушиватель изменений, который обновляет модель с помощью свойства files input элемент.

ДЕМО на ПЛНКР


Встроенная демонстрация files-input директива

angular.module("app",[]);

angular.module("app").directive("filesInput", function() {
  return {
    require: "ngModel",
    link: function postLink(scope,elem,attrs,ngModel) {
      elem.on("change", function(e) {
        var files = elem[0].files;
        ngModel.$setViewValue(files);
      })
    }
  }
});
<script src="//unpkg.com/angular/angular.js"></script>
  <body ng-app="app">
    <h1>AngularJS Input `type=file` Demo</h1>
    
    <input type="file" files-input ng-model="fileArray" multiple>
    
    <h2>Files</h2>
    <div ng-repeat="file in fileArray">
      {{file.name}}
    </div>
  </body>

Другие вопросы по тегам