diff options
Diffstat (limited to 'src/ng/directive/input.js')
| -rw-r--r-- | src/ng/directive/input.js | 78 | 
1 files changed, 70 insertions, 8 deletions
| diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js index d6ee26be..f584eda4 100644 --- a/src/ng/directive/input.js +++ b/src/ng/directive/input.js @@ -1003,8 +1003,8 @@ var VALID_CLASS = 'ng-valid',   *   *   */ -var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', -    function($scope, $exceptionHandler, $attr, $element, $parse) { +var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', +    function($scope, $exceptionHandler, $attr, $element, $parse, $animate) {    this.$viewValue = Number.NaN;    this.$modelValue = Number.NaN;    this.$parsers = []; @@ -1067,9 +1067,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$    // convenience method for easy toggling of classes    function toggleValidCss(isValid, validationErrorKey) {      validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; -    $element. -      removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey). -      addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey); +    $animate.removeClass($element, (isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey); +    $animate.addClass($element, (isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);    }    /** @@ -1128,7 +1127,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$    this.$setPristine = function () {      this.$dirty = false;      this.$pristine = true; -    $element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS); +    $animate.removeClass($element, DIRTY_CLASS); +    $animate.addClass($element, PRISTINE_CLASS);    };    /** @@ -1159,7 +1159,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$      if (this.$pristine) {        this.$dirty = true;        this.$pristine = false; -      $element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); +      $animate.removeClass($element, PRISTINE_CLASS); +      $animate.addClass($element, DIRTY_CLASS);        parentForm.$setDirty();      } @@ -1225,7 +1226,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$   *   require.   * - Providing validation behavior (i.e. required, number, email, url).   * - Keeping the state of the control (valid/invalid, dirty/pristine, validation errors). - * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`). + * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`) including animations.   * - Registering the control with its parent {@link ng.directive:form form}.   *   * Note: `ngModel` will try to bind to the property given by evaluating the expression on the @@ -1248,6 +1249,67 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$   *  - {@link ng.directive:select select}   *  - {@link ng.directive:textarea textarea}   * + * # CSS classes + * The following CSS classes are added and removed on the associated input/select/textarea element + * depending on the validity of the model. + * + *  - `ng-valid` is set if the model is valid. + *  - `ng-invalid` is set if the model is invalid. + *  - `ng-pristine` is set if the model is pristine. + *  - `ng-dirty` is set if the model is dirty. + * + * Keep in mind that ngAnimate can detect each of these classes when added and removed. + * + * ## Animation Hooks + * + * Animations within models are triggered when any of the associated CSS classes are added and removed + * on the input element which is attached to the model. These classes are: `.pristine`, `.dirty`, + * `.invalid` and `.valid` as well as any other validations that are performed on the model itself. + * The animations that are triggered within ngModel are similar to how they work in ngClass and + * animations can be hooked into using CSS transitions, keyframes as well as JS animations. + * + * The following example shows a simple way to utilize CSS transitions to style an input element + * that has been rendered as invalid after it has been validated: + * + * <pre> + * //be sure to include ngAnimate as a module to hook into more + * //advanced animations + * .my-input { + *   transition:0.5s linear all; + *   background: white; + * } + * .my-input.ng-invalid { + *   background: red; + *   color:white; + * } + * </pre> + * + * @example + * <example deps="angular-animate.js" animations="true" fixBase="true"> +     <file name="index.html"> +       <script> +        function Ctrl($scope) { +          $scope.val = '1'; +        } +       </script> +       <style> +         .my-input { +           -webkit-transition:all linear 0.5s; +           transition:all linear 0.5s; +           background: transparent; +         } +         .my-input.ng-invalid { +           color:white; +           background: red; +         } +       </style> +       Update input to see transitions when valid/invalid. +       Integer is a valid value. +       <form name="testForm" ng-controller="Ctrl"> +         <input ng-model="val" ng-pattern="/^\d+$/" name="anim" class="my-input" /> +       </form> +     </file> + * </example>   */  var ngModelDirective = function() {    return { | 
