I had the same problem trying to validate a from for creating a new user with four fiels: firstName, lastName, age and emailAddress.
I tried to use the $invalid default state, but it does not feel the correct format of an email address: {some characters}@{some characters}.{some characters}.
So I was able to solve it with ng-pattern. Here a snippet of my code.
<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<body ng-app="">
<form name="newUserModalForm">
<div>
<input type="text" name="Name" placeholder="firstName" ng-model="new_first_name_modal" ng-pattern="/^[a-zA-Z ,.'-]+$/" required>
<span style="color:Red" ng-show="newUserModalForm.Name.$error.required"> Required! </span>
<span style="color:Red" ng-show="newUserModalForm.Name.$dirty && newUserModalForm.Name.$error.pattern"> Invalid name! </span>
</div>
<div>
<input type="text" name="Surname" placeholder="lastName" ng-model="new_last_name_modal" ng-pattern="/^[a-zA-Z ,.'-]+$/" required>
<span style="color:Red" ng-show="newUserModalForm.Surname.$error.required"> Required! </span>
<span style="color:Red" ng-show="newUserModalForm.Surname.$dirty && newUserModalForm.Surname.$error.pattern"> Invalid surname! </span>
</div>
<div>
<input type="text" name="Age" placeholder="Age" ng-model="new_age_modal" ng-pattern="/^[0-9]{1,3}$/" required>
<span style="color:Red" ng-show="newUserModalForm.Age.$error.required"> Required! </span>
<span style="color:Red" ng-show="newUserModalForm.Age.$dirty && newUserModalForm.Age.$error.pattern"> Insert
a valid age! </span>
</div>
<div>
<input type="text" name="Email" placeholder="Email" ng-model="new_email_modal"
ng-pattern="/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/"
required>
<span style="color:Red" ng-show="newUserModalForm.Email.$error.required"> Required! </span>
<span style="color:Red" ng-show="newUserModalForm.Email.$dirty && newUserModalForm.Email.$error.pattern">
Insert a valid email address! </span>
</div>
</form>
</body>
</html>
I used regular expressions for validating the input fields.
Name and surname: ^[a-zA-Z ,.'-]+$. It matches all names with all letters, also uppercase, no numbers and characters like . ' and - .
Age: ^[0-9]{1,3}$. It matches all numbers, max 3 digit.
Email:^[\w-]+(.[\w-]+)@([a-z0-9-]+(.[a-z0-9-]+)?.[a-z]{2,6}|(\d{1,3}.){3}\d{1,3})(:\d{4})?$. I found this here : https://stackoverflow.com/a/42452767/18420603
You can test the code here: https://codepen.io/bbbgl/pen/XWxLoNe
Hope this will help you.