@@ -1624,4 +1624,55 @@ describe('ngRepeat animations', function() {
16241624 expect ( item . element . text ( ) ) . toBe ( '2' ) ;
16251625 } )
16261626 ) ;
1627+ it ( 'should maintain the order when the track by expression evaluates to an integer' ,
1628+ inject ( function ( $compile , $rootScope , $animate , $document , $sniffer , $timeout ) {
1629+ if ( ! $sniffer . transitions ) return ;
1630+
1631+ var item ;
1632+ var ss = createMockStyleSheet ( $document ) ;
1633+
1634+ var items = [
1635+ { id : 1 , name : 'A' } ,
1636+ { id : 2 , name : 'B' } ,
1637+ { id : 4 , name : 'C' } ,
1638+ { id : 3 , name : 'D' }
1639+ ] ;
1640+
1641+ try {
1642+
1643+ $animate . enabled ( true ) ;
1644+
1645+ ss . addRule ( '.animate-me div' ,
1646+ 'transition:1s linear all;' ) ;
1647+
1648+ element = $compile ( html ( '<div class="animate-me">' +
1649+ '<div ng-repeat="item in items track by item.id">{{ item.name }}</div>' +
1650+ '</div>' ) ) ( $rootScope ) ;
1651+
1652+ $rootScope . items = [ items [ 0 ] , items [ 1 ] , items [ 2 ] ] ;
1653+ $rootScope . $digest ( ) ;
1654+ expect ( element . text ( ) ) . toBe ( 'ABC' ) ;
1655+
1656+ $rootScope . items . push ( items [ 3 ] ) ;
1657+ $rootScope . $digest ( ) ;
1658+
1659+ expect ( element . text ( ) ) . toBe ( 'ABCD' ) ; // the original order should be preserved
1660+ $animate . flush ( ) ;
1661+ $timeout . flush ( 1500 ) ; // 1s * 1.5 closing buffer
1662+ expect ( element . text ( ) ) . toBe ( 'ABCD' ) ;
1663+
1664+ $rootScope . items = [ items [ 0 ] , items [ 1 ] , items [ 3 ] ] ;
1665+ $rootScope . $digest ( ) ;
1666+
1667+ // The leaving item should maintain it's position until it is removed
1668+ expect ( element . text ( ) ) . toBe ( 'ABCD' ) ;
1669+ $animate . flush ( ) ;
1670+ $timeout . flush ( 1500 ) ; // 1s * 1.5 closing buffer
1671+ expect ( element . text ( ) ) . toBe ( 'ABD' ) ;
1672+
1673+ } finally {
1674+ ss . destroy ( ) ;
1675+ }
1676+ } )
1677+ ) ;
16271678} ) ;
0 commit comments