diff options
Diffstat (limited to 'src/ng/directive/ngIf.js')
| -rwxr-xr-x | src/ng/directive/ngIf.js | 83 | 
1 files changed, 83 insertions, 0 deletions
| diff --git a/src/ng/directive/ngIf.js b/src/ng/directive/ngIf.js new file mode 100755 index 00000000..f1ceccda --- /dev/null +++ b/src/ng/directive/ngIf.js @@ -0,0 +1,83 @@ +'use strict'; + +/** + * @ngdoc directive + * @name ng.directive:ngIf + * @restrict A + * + * @description + * The `ngIf` directive removes and recreates a portion of the DOM tree (HTML) + * conditionally based on **"falsy"** and **"truthy"** values, respectively, evaluated within + * an {expression}. In other words, if the expression assigned to **ngIf evaluates to a false + * value** then **the element is removed from the DOM** and **if true** then **a clone of the + * element is reinserted into the DOM**. + * + * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the + * element in the DOM rather than changing its visibility via the `display` css property.  A common + * case when this difference is significant is when using css selectors that rely on an element's + * position within the DOM (HTML), such as the `:first-child` or `:last-child` pseudo-classes. + * + * Note that **when an element is removed using ngIf its scope is destroyed** and **a new scope + * is created when the element is restored**.  The scope created within `ngIf` inherits from  + * its parent scope using + * {@link https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance prototypal inheritance}. + * An important implication of this is if `ngModel` is used within `ngIf` to bind to + * a javascript primitive defined in the parent scope. In this case any modifications made to the + * variable within the child scope will override (hide) the value in the parent scope. + * + * Also, `ngIf` recreates elements using their compiled state. An example scenario of this behavior + * is if an element's class attribute is directly modified after it's compiled, using something like  + * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element + * the added class will be lost because the original compiled state is used to regenerate the element. + * + * Additionally, you can provide animations via the ngAnimate attribute to animate the **enter** + * and **leave** effects. + * + * @animations + * enter - happens just after the ngIf contents change and a new DOM element is created and injected into the ngIf container + * leave - happens just before the ngIf contents are removed from the DOM + * + * @element ANY + * @scope + * @param {expression} ngIf If the {@link guide/expression expression} is falsy then + *     the element is removed from the DOM tree (HTML). + * + * @example +   <doc:example> +     <doc:source> +        Click me: <input type="checkbox" ng-model="checked" ng-init="checked=true" /><br/> +        Show when checked: <span ng-if="checked">I'm removed when the checkbox is unchecked</span> +     </doc:source> +   </doc:example> + */ +var ngIfDirective = ['$animator', function($animator) { +  return { +    transclude: 'element', +    priority: 1000, +    terminal: true, +    restrict: 'A', +    compile: function (element, attr, transclude) { +      return function ($scope, $element, $attr) { +        var animate = $animator($scope, $attr); +        var childElement, childScope; +        $scope.$watch($attr.ngIf, function ngIfWatchAction(value) { +          if (childElement) { +            animate.leave(childElement); +            childElement = undefined; +          } +          if (childScope) { +            childScope.$destroy(); +            childScope = undefined; +          } +          if (toBoolean(value)) { +            childScope = $scope.$new(); +            transclude(childScope, function (clone) { +              childElement = clone; +              animate.enter(clone, $element.parent(), $element); +            }); +          } +        }); +      } +    } +  } +}]; | 
