-
Notifications
You must be signed in to change notification settings - Fork 27.3k
Fix ngAnimateChildren + ngIf, add docs for the directive #13876
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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, children 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), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There's a |
||
* | ||
* | ||
* @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 cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it's more readable (and consistent) with a space after |
||
} | ||
|
||
.container.ng-enter, | ||
.container.ng-leave.ng-leave-active { | ||
opacity:0; | ||
} | ||
|
||
.container.ng-leave, | ||
.container.ng-enter.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(attrs.ngAnimateChildren)(scope)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It could also be |
||
attrs.$observe('ngAnimateChildren', setData); | ||
} | ||
|
||
function setData(value) { | ||
value = value === 'on' || value === 'true'; | ||
element.data(NG_ANIMATE_CHILDREN_DATA, value); | ||
}); | ||
} | ||
} | ||
}; | ||
}]; |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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($animate, $rootScope, $rootElement, $compile) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is |
||
|
||
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() { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think
child elements
sounds better.