Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit 229f7d2

Browse files
committed
fix(carousel): fix animations with 1.4
- Change to use `$animateCss` in angular 1.4 and fallback to existing behavior for angular 1.3
1 parent 9f593ba commit 229f7d2

File tree

1 file changed

+55
-20
lines changed

1 file changed

+55
-20
lines changed

Diff for: src/carousel/carousel.js

+55-20
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
*
88
*/
99
angular.module('ui.bootstrap.carousel', [])
10-
.controller('CarouselController', ['$scope', '$element', '$interval', '$animate', function ($scope, $element, $interval, $animate) {
10+
.constant('ANIMATE_CSS', angular.version.minor >= 4)
11+
.controller('CarouselController', ['$scope', '$element', '$interval', '$animate', 'ANIMATE_CSS', function ($scope, $element, $interval, $animate, ANIMATE_CSS) {
1112
var self = this,
1213
slides = self.slides = $scope.slides = [],
1314
NO_TRANSITION = 'uib-noTransition',
@@ -40,9 +41,18 @@ angular.module('ui.bootstrap.carousel', [])
4041
slide.$element) {
4142
slide.$element.data(SLIDE_DIRECTION, slide.direction);
4243
$scope.$currentTransition = true;
43-
slide.$element.one('$animate:close', function closeFn() {
44-
$scope.$currentTransition = null;
45-
});
44+
if (ANIMATE_CSS) {
45+
$animate.on('addClass', slide.$element, function (element, phase) {
46+
$scope.$currentTransition = null;
47+
if (!$scope.$currentTransition) {
48+
$animate.off('addClass', element);
49+
}
50+
});
51+
} else {
52+
slide.$element.one('$animate:close', function closeFn() {
53+
$scope.$currentTransition = null;
54+
});
55+
}
4656
}
4757

4858
self.currentSlide = slide;
@@ -316,10 +326,18 @@ function CarouselDemoCtrl($scope) {
316326
})
317327

318328
.animation('.item', [
319-
'$animate',
320-
function ($animate) {
329+
'$injector', '$animate', 'ANIMATE_CSS',
330+
function ($injector, $animate, ANIMATE_CSS) {
321331
var NO_TRANSITION = 'uib-noTransition',
322-
SLIDE_DIRECTION = 'uib-slideDirection';
332+
SLIDE_DIRECTION = 'uib-slideDirection',
333+
$animateCss = ANIMATE_CSS ? $injector.get('$animateCss') : null;
334+
335+
function removeClass(element, className, callback) {
336+
element.removeClass(className);
337+
if (callback) {
338+
callback();
339+
}
340+
}
323341

324342
return {
325343
beforeAddClass: function (element, className, done) {
@@ -329,13 +347,22 @@ function ($animate) {
329347
var stopped = false;
330348
var direction = element.data(SLIDE_DIRECTION);
331349
var directionClass = direction == 'next' ? 'left' : 'right';
350+
var removeClassFn = removeClass.bind(this, element,
351+
directionClass + ' ' + direction, done);
332352
element.addClass(direction);
333-
$animate.addClass(element, directionClass).then(function () {
334-
if (!stopped) {
335-
element.removeClass(directionClass + ' ' + direction);
336-
}
337-
done();
338-
});
353+
354+
if ($animateCss) {
355+
$animateCss(element, {addClass: directionClass})
356+
.start()
357+
.done(removeClassFn);
358+
} else {
359+
$animate.addClass(element, directionClass).then(function () {
360+
if (!stopped) {
361+
removeClassFn();
362+
}
363+
done();
364+
});
365+
}
339366

340367
return function () {
341368
stopped = true;
@@ -345,17 +372,25 @@ function ($animate) {
345372
},
346373
beforeRemoveClass: function (element, className, done) {
347374
// Due to transclusion, noTransition property is on parent's scope
348-
if (className == 'active' && element.parent() &&
375+
if (className === 'active' && element.parent() &&
349376
!element.parent().data(NO_TRANSITION)) {
350377
var stopped = false;
351378
var direction = element.data(SLIDE_DIRECTION);
352379
var directionClass = direction == 'next' ? 'left' : 'right';
353-
$animate.addClass(element, directionClass).then(function () {
354-
if (!stopped) {
355-
element.removeClass(directionClass);
356-
}
357-
done();
358-
});
380+
var removeClassFn = removeClass.bind(this, element, directionClass, done);
381+
382+
if ($animateCss) {
383+
$animateCss(element, {addClass: directionClass})
384+
.start()
385+
.done(removeClassFn);
386+
} else {
387+
$animate.addClass(element, directionClass).then(function () {
388+
if (!stopped) {
389+
removeClassFn();
390+
}
391+
done();
392+
});
393+
}
359394
return function () {
360395
stopped = true;
361396
};

0 commit comments

Comments
 (0)