Permalink
Comparing changes
Open a pull request
- 2 commits
- 2 files changed
- 0 commit comments
- 1 contributor
Commits on Jan 28, 2016
Previously, ngAnimateChildren would set the data on the element in an $observe listener, which means the data was available after one digest happend. This is too late when the element is animated immediately after compilation, as happens with ngIf. Now the data is also set right in the linking function. Fixes #13865 Closes #13876
Unified
Split
Showing
with
109 additions
and 8 deletions.
- +93 −8 src/ngAnimate/animateChildrenDirective.js
- +16 −0 test/ngAnimate/animateSpec.js
| @@ -1,15 +1,100 @@ | ||
| 'use strict'; | ||
|
|
||
| var $$AnimateChildrenDirective = [function() { | ||
| return function(scope, element, attrs) { | ||
| var val = attrs.ngAnimateChildren; | ||
| if (angular.isString(val) && val.length === 0) { //empty attribute | ||
| element.data(NG_ANIMATE_CHILDREN_DATA, true); | ||
| } else { | ||
| attrs.$observe('ngAnimateChildren', function(value) { | ||
| /** | ||
| * @ngdoc directive | ||
| * @name ngAnimateChildren | ||
| * @restrict AE | ||
| * @element ANY | ||
| * | ||
| * @description | ||
| * | ||
| * ngAnimateChildren allows you to specify that children of this element should animate even if any | ||
| * of the children's parents are currently animating. By default, when an element has an active `enter`, `leave`, or `move` | ||
| * (structural) animation, child elements that also have an active structural animation are not animated. | ||
| * | ||
| * Note that even if `ngAnimteChildren` is set, no child animations will run when the parent element is removed from the DOM (`leave` animation). | ||
| * | ||
| * | ||
| * @param {string} ngAnimateChildren If the value is empty, `true` or `on`, | ||
| * then child animations are allowed. If the value is `false`, child animations are not allowed. | ||
| * | ||
| * @example | ||
| * <example module="ngAnimateChildren" name="ngAnimateChildren" deps="angular-animate.js" animations="true"> | ||
| <file name="index.html"> | ||
| <div ng-controller="mainController as main"> | ||
| <label>Show container? <input type="checkbox" ng-model="main.enterElement" /></label> | ||
| <label>Animate children? <input type="checkbox" ng-model="main.animateChildren" /></label> | ||
| <hr> | ||
| <div ng-animate-children="{{main.animateChildren}}"> | ||
| <div ng-if="main.enterElement" class="container"> | ||
| List of items: | ||
| <div ng-repeat="item in [0, 1, 2, 3]" class="item">Item {{item}}</div> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| </file> | ||
| <file name="animations.css"> | ||
| .container.ng-enter, | ||
| .container.ng-leave { | ||
| transition: all ease 1.5s; | ||
| } | ||
| .container.ng-enter, | ||
| .container.ng-leave-active { | ||
| opacity: 0; | ||
| } | ||
| .container.ng-leave, | ||
| .container.ng-enter-active { | ||
| opacity: 1; | ||
| } | ||
| .item { | ||
| background: firebrick; | ||
| color: #FFF; | ||
| margin-bottom: 10px; | ||
| } | ||
| .item.ng-enter, | ||
| .item.ng-leave { | ||
| transition: transform 1.5s ease; | ||
| } | ||
| .item.ng-enter { | ||
| transform: translateX(50px); | ||
| } | ||
| .item.ng-enter-active { | ||
| transform: translateX(0); | ||
| } | ||
| </file> | ||
| <file name="script.js"> | ||
| angular.module('ngAnimateChildren', ['ngAnimate']) | ||
| .controller('mainController', function() { | ||
| this.animateChildren = false; | ||
| this.enterElement = false; | ||
| }); | ||
| </file> | ||
| </example> | ||
| */ | ||
| var $$AnimateChildrenDirective = ['$interpolate', function($interpolate) { | ||
| return { | ||
| link: function(scope, element, attrs) { | ||
| var val = attrs.ngAnimateChildren; | ||
| if (angular.isString(val) && val.length === 0) { //empty attribute | ||
| element.data(NG_ANIMATE_CHILDREN_DATA, true); | ||
| } else { | ||
| // Interpolate and set the value, so that it is available to | ||
| // animations that run right after compilation | ||
| setData($interpolate(val)(scope)); | ||
| attrs.$observe('ngAnimateChildren', setData); | ||
| } | ||
|
|
||
| function setData(value) { | ||
| value = value === 'on' || value === 'true'; | ||
| element.data(NG_ANIMATE_CHILDREN_DATA, value); | ||
| }); | ||
| } | ||
| } | ||
| }; | ||
| }]; |
| @@ -1492,6 +1492,22 @@ describe("animations", function() { | ||
| dealoc(element); | ||
| dealoc(child); | ||
| })); | ||
|
|
||
| it('should respect the value if the directive is on an element with ngIf', | ||
| inject(function($rootScope, $rootElement, $compile) { | ||
|
|
||
| parent.attr('ng-animate-children', 'true'); | ||
| parent.attr('ng-if', 'true'); | ||
| element.attr('ng-if', 'true'); | ||
|
|
||
| $rootElement.append(parent); | ||
| parent.append(element); | ||
|
|
||
| $compile(parent)($rootScope); | ||
| $rootScope.$digest(); | ||
|
|
||
| expect(captureLog.length).toBe(2); | ||
| })); | ||
| }); | ||
|
|
||
| describe('.pin()', function() { | ||