7
7
*
8
8
*/
9
9
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 ) {
11
12
var self = this ,
12
13
slides = self . slides = $scope . slides = [ ] ,
13
14
NO_TRANSITION = 'uib-noTransition' ,
@@ -40,9 +41,18 @@ angular.module('ui.bootstrap.carousel', [])
40
41
slide . $element ) {
41
42
slide . $element . data ( SLIDE_DIRECTION , slide . direction ) ;
42
43
$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
+ }
46
56
}
47
57
48
58
self . currentSlide = slide ;
@@ -147,6 +157,12 @@ angular.module('ui.bootstrap.carousel', [])
147
157
} ;
148
158
149
159
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
+
150
166
slide . $element = element ;
151
167
slides . push ( slide ) ;
152
168
//if this is the first slide or the slide is set to active, select it
@@ -316,10 +332,18 @@ function CarouselDemoCtrl($scope) {
316
332
} )
317
333
318
334
. animation ( '.item' , [
319
- '$animate' ,
320
- function ( $animate ) {
335
+ '$injector' , '$ animate' , 'ANIMATE_CSS ',
336
+ function ( $injector , $ animate, ANIMATE_CSS ) {
321
337
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
+ }
323
347
324
348
return {
325
349
beforeAddClass : function ( element , className , done ) {
@@ -329,13 +353,22 @@ function ($animate) {
329
353
var stopped = false ;
330
354
var direction = element . data ( SLIDE_DIRECTION ) ;
331
355
var directionClass = direction == 'next' ? 'left' : 'right' ;
356
+ var removeClassFn = removeClass . bind ( this , element ,
357
+ directionClass + ' ' + direction , done ) ;
332
358
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
+ }
339
372
340
373
return function ( ) {
341
374
stopped = true ;
@@ -345,17 +378,25 @@ function ($animate) {
345
378
} ,
346
379
beforeRemoveClass : function ( element , className , done ) {
347
380
// Due to transclusion, noTransition property is on parent's scope
348
- if ( className == 'active' && element . parent ( ) &&
381
+ if ( className === 'active' && element . parent ( ) &&
349
382
! element . parent ( ) . data ( NO_TRANSITION ) ) {
350
383
var stopped = false ;
351
384
var direction = element . data ( SLIDE_DIRECTION ) ;
352
385
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
+ }
359
400
return function ( ) {
360
401
stopped = true ;
361
402
} ;
0 commit comments