diff options
Diffstat (limited to 'src/ng/directive/form.js')
| -rw-r--r-- | src/ng/directive/form.js | 57 | 
1 files changed, 48 insertions, 9 deletions
| diff --git a/src/ng/directive/form.js b/src/ng/directive/form.js index c5e39cde..4e6ec20d 100644 --- a/src/ng/directive/form.js +++ b/src/ng/directive/form.js @@ -46,8 +46,8 @@ var nullFormCtrl = {   *   */  //asks for $scope to fool the BC controller module -FormController.$inject = ['$element', '$attrs', '$scope']; -function FormController(element, attrs) { +FormController.$inject = ['$element', '$attrs', '$scope', '$animate']; +function FormController(element, attrs, $scope, $animate) {    var form = this,        parentForm = element.parent().controller('form') || nullFormCtrl,        invalidCount = 0, // used to easily determine if we are valid @@ -70,9 +70,8 @@ function FormController(element, attrs) {    // 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);    }    /** @@ -173,7 +172,8 @@ function FormController(element, attrs) {     * state (ng-dirty class). This method will also propagate to parent forms.     */    form.$setDirty = function() { -    element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); +    $animate.removeClass(element, PRISTINE_CLASS); +    $animate.addClass(element, DIRTY_CLASS);      form.$dirty = true;      form.$pristine = false;      parentForm.$setDirty(); @@ -194,7 +194,8 @@ function FormController(element, attrs) {     * saving or resetting it.     */    form.$setPristine = function () { -    element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS); +    $animate.removeClass(element, DIRTY_CLASS); +    $animate.addClass(element, PRISTINE_CLASS);      form.$dirty = false;      form.$pristine = true;      forEach(controls, function(control) { @@ -249,6 +250,8 @@ function FormController(element, attrs) {   *  - `ng-pristine` is set if the form is pristine.   *  - `ng-dirty` is set if the form is dirty.   * + * Keep in mind that ngAnimate can detect each of these classes when added and removed. + *   *   * # Submitting a form and preventing the default action   * @@ -282,15 +285,48 @@ function FormController(element, attrs) {   * @param {string=} name Name of the form. If specified, the form controller will be published into   *                       related scope, under this name.   * + * ## Animation Hooks + * + * Animations in ngForm are triggered when any of the associated CSS classes are added and removed. These + * classes are: `.pristine`, `.dirty`, `.invalid` and `.valid` as well as any other validations that + * are performed within the form. Animations in ngForm 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 a form 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-form { + *   transition:0.5s linear all; + *   background: white; + * } + * .my-form.ng-invalid { + *   background: red; + *   color:white; + * } + * </pre> + *   * @example -    <example> +    <example deps="angular-animate.js" animations="true" fixBase="true">        <file name="index.html">         <script>           function Ctrl($scope) {             $scope.userType = 'guest';           }         </script> -       <form name="myForm" ng-controller="Ctrl"> +       <style> +        .my-form { +          -webkit-transition:all linear 0.5s; +          transition:all linear 0.5s; +          background: transparent; +        } +        .my-form.ng-invalid { +          background: red; +        } +       </style> +       <form name="myForm" ng-controller="Ctrl" class="my-form">           userType: <input name="input" ng-model="userType" required>           <span class="error" ng-show="myForm.input.$error.required">Required!</span><br>           <tt>userType = {{userType}}</tt><br> @@ -322,6 +358,9 @@ function FormController(element, attrs) {          });        </file>      </example> + * + * @param {string=} name Name of the form. If specified, the form controller will be published into + *                       related scope, under this name.   */  var formDirectiveFactory = function(isNgForm) {    return ['$timeout', function($timeout) { | 
