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

Commit f45b4a4

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 Closes #3946 Closes #4041 Fixes #3811
1 parent 42e1af5 commit f45b4a4

File tree

1 file changed

+61
-20
lines changed

1 file changed

+61
-20
lines changed

src/carousel/carousel.js

+61-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;
@@ -147,6 +157,12 @@ angular.module('ui.bootstrap.carousel', [])
147157
};
148158

149159
self.addSlide = function(slide, element) {
160+
// add default direction for initial transition
161+
// necessary for angular 1.4+
162+
if (!slides.length && element) {
163+
element.data(SLIDE_DIRECTION, 'next');
164+
}
165+
150166
slide.$element = element;
151167
slides.push(slide);
152168
//if this is the first slide or the slide is set to active, select it
@@ -316,10 +332,18 @@ function CarouselDemoCtrl($scope) {
316332
})
317333

318334
.animation('.item', [
319-
'$animate',
320-
function ($animate) {
335+
'$injector', '$animate', 'ANIMATE_CSS',
336+
function ($injector, $animate, ANIMATE_CSS) {
321337
var NO_TRANSITION = 'uib-noTransition',
322-
SLIDE_DIRECTION = 'uib-slideDirection';
338+
SLIDE_DIRECTION = 'uib-slideDirection',
339+
$animateCss = ANIMATE_CSS ? $injector.get('$animateCss') : null;
340+
341+
function removeClass(element, className, callback) {
342+
element.removeClass(className);
343+
if (callback) {
344+
callback();
345+
}
346+
}
323347

324348
return {
325349
beforeAddClass: function (element, className, done) {
@@ -329,13 +353,22 @@ function ($animate) {
329353
var stopped = false;
330354
var direction = element.data(SLIDE_DIRECTION);
331355
var directionClass = direction == 'next' ? 'left' : 'right';
356+
var removeClassFn = removeClass.bind(this, element,
357+
directionClass + ' ' + direction, done);
332358
element.addClass(direction);
333-
$animate.addClass(element, directionClass).then(function () {
334-
if (!stopped) {
335-
element.removeClass(directionClass + ' ' + direction);
336-
}
337-
done();
338-
});
359+
360+
if ($animateCss) {
361+
$animateCss(element, {addClass: directionClass})
362+
.start()
363+
.done(removeClassFn);
364+
} else {
365+
$animate.addClass(element, directionClass).then(function () {
366+
if (!stopped) {
367+
removeClassFn();
368+
}
369+
done();
370+
});
371+
}
339372

340373
return function () {
341374
stopped = true;
@@ -345,17 +378,25 @@ function ($animate) {
345378
},
346379
beforeRemoveClass: function (element, className, done) {
347380
// Due to transclusion, noTransition property is on parent's scope
348-
if (className == 'active' && element.parent() &&
381+
if (className === 'active' && element.parent() &&
349382
!element.parent().data(NO_TRANSITION)) {
350383
var stopped = false;
351384
var direction = element.data(SLIDE_DIRECTION);
352385
var directionClass = direction == 'next' ? 'left' : 'right';
353-
$animate.addClass(element, directionClass).then(function () {
354-
if (!stopped) {
355-
element.removeClass(directionClass);
356-
}
357-
done();
358-
});
386+
var removeClassFn = removeClass.bind(this, element, directionClass, done);
387+
388+
if ($animateCss) {
389+
$animateCss(element, {addClass: directionClass})
390+
.start()
391+
.done(removeClassFn);
392+
} else {
393+
$animate.addClass(element, directionClass).then(function () {
394+
if (!stopped) {
395+
removeClassFn();
396+
}
397+
done();
398+
});
399+
}
359400
return function () {
360401
stopped = true;
361402
};

0 commit comments

Comments
 (0)