Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to validate form with input[type=file] in angularjs

Tags:

HTML:

<form name="form">     <input type="file" ng-model="document" valid-file required>     <input type="submit" value="{{ !form.$valid && 'invalid' || 'valid' }}"> </form> 

Custom directive to listen for input[type=file] changes:

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

When file is selected following error appears in console:

Error: InvalidStateError: DOM Exception 11 Error: An attempt was made to use an object that is not, or is no longer, usable.

Try with plunkr: http://plnkr.co/edit/C5j5e0JyMjt9vUopLDHc?p=preview

Without the directive the the state of the input file field wont be pushed to form.$valid. Any ideas why I get this error and how to fix this?

like image 443
UpCat Avatar asked Aug 22 '13 14:08

UpCat


People also ask

How do you check whether a form is valid or not in AngularJS?

The form instance can optionally be published into the scope using the name attribute. So to check form validity, you can check value of $scope. yourformname. $valid property of scope.

What is $setValidity in AngularJS?

The $setValidity() function is a built-in AngularJS function that is used to assign a key/value combination that can be used to check the validity of a specific model value. The key in this case is “unique” and the value is either true or false.

What is $dirty in AngularJS?

$dirty means the user has changed the input value, $invalid means the address itself is invalid. Therefore the error is only shown if the user has actively changed the input value to either an empty or invalid value.


1 Answers

From the reference of NgModelController.$render()

Called when the view needs to be updated. It is expected that the user of the ng-model directive will implement this method.

You need to implement $render() to call it. You can do something like this

myApp.directive('validFile', function () {     return {         require: 'ngModel',         link: function (scope, el, attrs, ngModel) {             ngModel.$render = function () {                 ngModel.$setViewValue(el.val());             };              el.bind('change', function () {                 scope.$apply(function () {                     ngModel.$render();                 });             });         }     }; }); 

DEMO

like image 103
zs2020 Avatar answered Oct 13 '22 01:10

zs2020