Search code examples
javascriptformsangularjsrequired

Angular is automatically adding 'ng-invalid' class on 'required' fields


I am building an angular app for which I have some forms set up. I have some fields that are required to be filled before submission. Therefore I have added 'required' on them:

<input type="text" class="form-control" placeholder="Test" ng-model="data.test" required>

However when I launch my app, the fields are displayed as 'invalid' and the classes 'ng-invalid' and 'ng-invalid-required' even before the submit button has been click or before the user has typed anything in the fields.

How can I make sure that thoses 2 classes are not added immediately but either once the user has submitted the form or when he has typed something wrong in the corresponding field?


Solution

  • Since the inputs are empty and therefore invalid when instantiated, Angular correctly adds the ng-invalid class.

    A CSS rule you might try:

    input.ng-dirty.ng-invalid {
      color: red
    }
    

    Which basically states when the field has had something entered into it at some point since the page loaded and wasn't reset to pristine by $scope.formName.setPristine(true) and something wasn't yet entered and it's invalid then the text turns red.

    Other useful classes for Angular forms (see input for future reference )

    ng-valid-maxlength - when ng-maxlength passes
    ng-valid-minlength - when ng-minlength passes
    ng-valid-pattern - when ng-pattern passes
    ng-dirty - when the form has had something entered since the form loaded
    ng-pristine - when the form input has had nothing inserted since loaded (or it was reset via setPristine(true) on the form)
    ng-invalid - when any validation fails (required, minlength, custom ones, etc)

    Likewise there is also ng-invalid-<name> for all these patterns and any custom ones created.