Note: Can use $dirty to check whether user has intracted with the form:
https://docs.angularjs.org/api/ng/type/form.FormController
Read More:
http://www.yearofmoo.com/2014/05/how-to-use-ngmessages-in-angularjs.html
https://egghead.io/lessons/angularjs-using-ng-messages-with-ng-animate
<!DOCTYPE html> <html> <head> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular-messages.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular-animate.js"></script> <title>What's new in Angular 1.3</title> </head> <body ng-app="app" ng-controller="MainCtrl as vm"> <h1>Angular {{vm.angularVersion}}</h1> <h2> Using ngMessages with ngAnimate <small>by <a href="http://twitter.com/kentcdodds">@kentcdodds</a></small> </h2> <hr /> <h2>Demo</h2> <form name="myForm"> <input type="email" name="myField" ng-model="field" required minlength="5" /> <div class="my-messages" ng-show="myForm.myField.$touched" ng-messages="myForm.myField.$error"> <div class="some-message" ng-message="required">This field is required</div> <div class="some-message" ng-message="minlength">Input too short</div> <div class="some-message" ng-message="email">This field must be an email</div> </div> </form> </body> </html>
.my-messages { position: relative; } .my-messages.ng-active { /* messages are showing */ } .my-messages.ng-inactive { /* messages are not showing */ } .some-message { position: absolute; opacity: 1; transition: .3s linear all; font-size: .8em; } .some-message.ng-enter.ng-enter-active { opacity: 1; top: 0; } .some-message.ng-enter { opacity: 0; top: -20px; } .some-message.ng-leave { opacity: 1; top: 0; } .some-message.ng-leave-active { opacity: 0; top: 20px; }
var app = angular.module('app', ['ngMessages', 'ngAnimate']); app.controller('MainCtrl', function MainCtrl() { 'use strict'; var vm = this; vm.angularVersion = angular.version.full; });