Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit bfad2a4

Browse files
sreeramupetebacondarwin
authored andcommitted
fix($animate): ensure leave animation calls close callback
Closes #12278 Closes #12096 Closes #13054
1 parent 54e8165 commit bfad2a4

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

src/ngAnimate/animateQueue.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -139,15 +139,18 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
139139
return mergeAnimationOptions(element, options, {});
140140
}
141141

142-
function findCallbacks(element, event) {
142+
function findCallbacks(parent, element, event) {
143143
var targetNode = getDomNode(element);
144+
var targetParentNode = getDomNode(parent);
144145

145146
var matches = [];
146147
var entries = callbackRegistry[event];
147148
if (entries) {
148149
forEach(entries, function(entry) {
149150
if (entry.node.contains(targetNode)) {
150151
matches.push(entry.callback);
152+
} else if (event === 'leave' && entry.node.contains(targetParentNode)) {
153+
matches.push(entry.callback);
151154
}
152155
});
153156
}
@@ -473,7 +476,7 @@ var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) {
473476

474477
function notifyProgress(runner, event, phase, data) {
475478
runInNextPostDigestOrNow(function() {
476-
var callbacks = findCallbacks(element, event);
479+
var callbacks = findCallbacks(parent, element, event);
477480
if (callbacks.length) {
478481
// do not optimize this call here to RAF because
479482
// we don't know how heavy the callback code here will

test/ngAnimate/animateSpec.js

+81
Original file line numberDiff line numberDiff line change
@@ -1781,5 +1781,86 @@ describe("animations", function() {
17811781
expect(isElementRemoved).toBe(true);
17821782
}));
17831783

1784+
it('leave : should trigger a callback for an leave animation',
1785+
inject(function($animate, $rootScope, $$rAF, $rootElement, $document) {
1786+
1787+
var callbackTriggered = false;
1788+
$animate.on('leave', jqLite($document[0].body), function() {
1789+
callbackTriggered = true;
1790+
});
1791+
1792+
element = jqLite('<div></div>');
1793+
$rootElement.append(element);
1794+
$animate.leave(element, $rootElement);
1795+
$rootScope.$digest();
1796+
1797+
$$rAF.flush();
1798+
1799+
expect(callbackTriggered).toBe(true);
1800+
}));
1801+
1802+
it('leave : should not fire a callback if the element is outside of the given container',
1803+
inject(function($animate, $rootScope, $$rAF, $rootElement) {
1804+
1805+
var callbackTriggered = false;
1806+
var innerContainer = jqLite('<div></div>');
1807+
$rootElement.append(innerContainer);
1808+
1809+
$animate.on('leave', innerContainer,
1810+
function(element, phase, data) {
1811+
callbackTriggered = true;
1812+
});
1813+
1814+
element = jqLite('<div></div>');
1815+
$rootElement.append(element);
1816+
$animate.leave(element, $rootElement);
1817+
$rootScope.$digest();
1818+
1819+
expect(callbackTriggered).toBe(false);
1820+
}));
1821+
1822+
it('leave : should fire a `start` callback when the animation starts with the matching element',
1823+
inject(function($animate, $rootScope, $$rAF, $rootElement, $document) {
1824+
1825+
element = jqLite('<div></div>');
1826+
1827+
var capturedState;
1828+
var capturedElement;
1829+
$animate.on('leave', jqLite($document[0].body), function(element, phase) {
1830+
capturedState = phase;
1831+
capturedElement = element;
1832+
});
1833+
1834+
$rootElement.append(element);
1835+
$animate.leave(element, $rootElement);
1836+
$rootScope.$digest();
1837+
$$rAF.flush();
1838+
1839+
expect(capturedState).toBe('start');
1840+
expect(capturedElement).toBe(element);
1841+
}));
1842+
1843+
it('leave : should fire a `close` callback when the animation ends with the matching element',
1844+
inject(function($animate, $rootScope, $$rAF, $rootElement, $document) {
1845+
1846+
element = jqLite('<div></div>');
1847+
1848+
var capturedState;
1849+
var capturedElement;
1850+
$animate.on('leave', jqLite($document[0].body), function(element, phase) {
1851+
capturedState = phase;
1852+
capturedElement = element;
1853+
});
1854+
1855+
$rootElement.append(element);
1856+
var runner = $animate.leave(element, $rootElement);
1857+
$rootScope.$digest();
1858+
runner.end();
1859+
$$rAF.flush();
1860+
1861+
expect(capturedState).toBe('close');
1862+
expect(capturedElement).toBe(element);
1863+
}));
1864+
17841865
});
17851866
});

0 commit comments

Comments
 (0)