diff options
| author | Misko Hevery | 2013-03-20 16:24:23 -0700 | 
|---|---|---|
| committer | Misko Hevery | 2013-04-02 14:05:06 -0700 | 
| commit | 0b6f1ce5f89f47f9302ff1e8cd8f4b92f837c413 (patch) | |
| tree | 8cbc0c86024dd4f97d0aa54e0c9b7df9b0d56b86 /src/ng/directive/ngSwitch.js | |
| parent | 4bfb66ce0be46d3a0e9da2f80f3e1d0c2b559828 (diff) | |
| download | angular.js-0b6f1ce5f89f47f9302ff1e8cd8f4b92f837c413.tar.bz2 | |
feat(ngAnimate): add support for animation
Diffstat (limited to 'src/ng/directive/ngSwitch.js')
| -rw-r--r-- | src/ng/directive/ngSwitch.js | 92 | 
1 files changed, 56 insertions, 36 deletions
| diff --git a/src/ng/directive/ngSwitch.js b/src/ng/directive/ngSwitch.js index f22e634d..8b0dab31 100644 --- a/src/ng/directive/ngSwitch.js +++ b/src/ng/directive/ngSwitch.js @@ -6,15 +6,30 @@   * @restrict EA   *   * @description - * Conditionally change the DOM structure. Elements within ngSwitch but without - * ngSwitchWhen or ngSwitchDefault directives will be preserved at the location - * as specified in the template + * The ngSwitch directive is used to conditionally swap DOM structure on your template based on a scope expression. + * Elements within ngSwitch but without ngSwitchWhen or ngSwitchDefault directives will be preserved at the location + * as specified in the template. + * + * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it + * from the template cache), ngSwitch simply choses one of the nested elements and makes it visible based on which element + * matches the value obtained from the evaluated expression. In other words, you define a container element + * (where you place the directive), place an expression on the **on="..." attribute** + * (or the **ng-switch="..." attribute**), define any inner elements inside of the directive and place + * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on + * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default + * attribute is displayed. + * + * Additionally, you can also provide animations via the ngAnimate attribute to animate the **enter** + * and **leave** effects. + * + * @animations + * enter - happens after the ngSwtich contents change and the matched child element is placed inside the container + * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM   *   * @usage   * <ANY ng-switch="expression">   *   <ANY ng-switch-when="matchValue1">...</ANY>   *   <ANY ng-switch-when="matchValue2">...</ANY> - *   ...   *   <ANY ng-switch-default>...</ANY>   * </ANY>   * @@ -67,43 +82,48 @@        </doc:scenario>      </doc:example>   */ -var NG_SWITCH = 'ng-switch'; -var ngSwitchDirective = valueFn({ -  restrict: 'EA', -  require: 'ngSwitch', -  // asks for $scope to fool the BC controller module -  controller: ['$scope', function ngSwitchController() { -    this.cases = {}; -  }], -  link: function(scope, element, attr, ctrl) { -    var watchExpr = attr.ngSwitch || attr.on, -        selectedTranscludes, -        selectedElements, -        selectedScopes = []; +var ngSwitchDirective = ['$animator', function($animator) { +  return { +    restrict: 'EA', +    require: 'ngSwitch', -    scope.$watch(watchExpr, function ngSwitchWatchAction(value) { -      for (var i= 0, ii=selectedScopes.length; i<ii; i++) { -        selectedScopes[i].$destroy(); -        selectedElements[i].remove(); -      } +    // asks for $scope to fool the BC controller module +    controller: ['$scope', function ngSwitchController() { +     this.cases = {}; +    }], +    link: function(scope, element, attr, ngSwitchController) { +      var animate = $animator(scope, attr); +      var watchExpr = attr.ngSwitch || attr.on, +          selectedTranscludes, +          selectedElements, +          selectedScopes = []; -      selectedElements = []; -      selectedScopes = []; +      scope.$watch(watchExpr, function ngSwitchWatchAction(value) { +        for (var i= 0, ii=selectedScopes.length; i<ii; i++) { +          selectedScopes[i].$destroy(); +          animate.leave(selectedElements[i]); +        } -      if ((selectedTranscludes = ctrl.cases['!' + value] || ctrl.cases['?'])) { -        scope.$eval(attr.change); -        forEach(selectedTranscludes, function(selectedTransclude) { -          var selectedScope = scope.$new(); -          selectedScopes.push(selectedScope); -          selectedTransclude.transclude(selectedScope, function(caseElement) { -            selectedElements.push(caseElement); -            selectedTransclude.element.after(caseElement); +        selectedElements = []; +        selectedScopes = []; + +        if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) { +          scope.$eval(attr.change); +          forEach(selectedTranscludes, function(selectedTransclude) { +            var selectedScope = scope.$new(); +            selectedScopes.push(selectedScope); +            selectedTransclude.transclude(selectedScope, function(caseElement) { +              var anchor = selectedTransclude.element; + +              selectedElements.push(caseElement); +              animate.enter(caseElement, anchor.parent(), anchor); +            });            }); -        }); -      } -    }); +        } +      }); +    }    } -}); +}];  var ngSwitchWhenDirective = ngDirective({    transclude: 'element', | 
