77*
88*/
99angular . 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