@@ -365,7 +365,7 @@ export function main() {
365365 it ( 'should not replace tracked items' ,
366366 inject ( [ TestComponentBuilder , AsyncTestCompleter ] , ( tcb : TestComponentBuilder , async ) => {
367367 var template =
368- `<template ngFor #item [ngForOf]="items" [ngForTrackBy]="customTrackBy " #i="index">
368+ `<template ngFor #item [ngForOf]="items" [ngForTrackBy]="trackById " #i="index">
369369 <p>{{items[i]}}</p>
370370 </template>` ;
371371 tcb . overrideTemplate ( TestComponent , template )
@@ -387,7 +387,7 @@ export function main() {
387387 it ( 'should update implicit local variable on view' ,
388388 inject ( [ TestComponentBuilder , AsyncTestCompleter ] , ( tcb : TestComponentBuilder , async ) => {
389389 var template =
390- `<div><template ngFor #item [ngForOf]="items" [ngForTrackBy]="customTrackBy ">{{item['color']}}</template></div>` ;
390+ `<div><template ngFor #item [ngForOf]="items" [ngForTrackBy]="trackById ">{{item['color']}}</template></div>` ;
391391 tcb . overrideTemplate ( TestComponent , template )
392392 . createAsync ( TestComponent )
393393 . then ( ( fixture ) => {
@@ -403,7 +403,7 @@ export function main() {
403403 it ( 'should move items around and keep them updated ' ,
404404 inject ( [ TestComponentBuilder , AsyncTestCompleter ] , ( tcb : TestComponentBuilder , async ) => {
405405 var template =
406- `<div><template ngFor #item [ngForOf]="items" [ngForTrackBy]="customTrackBy ">{{item['color']}}</template></div>` ;
406+ `<div><template ngFor #item [ngForOf]="items" [ngForTrackBy]="trackById ">{{item['color']}}</template></div>` ;
407407 tcb . overrideTemplate ( TestComponent , template )
408408 . createAsync ( TestComponent )
409409 . then ( ( fixture ) => {
@@ -418,6 +418,24 @@ export function main() {
418418 async . done ( ) ;
419419 } ) ;
420420 } ) ) ;
421+
422+ it ( 'should handle added and removed items properly when tracking by index' ,
423+ inject ( [ TestComponentBuilder , AsyncTestCompleter ] , ( tcb : TestComponentBuilder , async ) => {
424+ var template =
425+ `<div><template ngFor #item [ngForOf]="items" [ngForTrackBy]="trackByIndex">{{item}}</template></div>` ;
426+ tcb . overrideTemplate ( TestComponent , template )
427+ . createAsync ( TestComponent )
428+ . then ( ( fixture ) => {
429+ fixture . debugElement . componentInstance . items = [ 'a' , 'b' , 'c' , 'd' ] ;
430+ fixture . detectChanges ( ) ;
431+ fixture . debugElement . componentInstance . items = [ 'e' , 'f' , 'g' , 'h' ] ;
432+ fixture . detectChanges ( ) ;
433+ fixture . debugElement . componentInstance . items = [ 'e' , 'f' , 'h' ] ;
434+ fixture . detectChanges ( ) ;
435+ expect ( fixture . debugElement . nativeElement ) . toHaveText ( 'efh' ) ;
436+ async . done ( ) ;
437+ } ) ;
438+ } ) ) ;
421439 } ) ;
422440 } ) ;
423441}
@@ -432,7 +450,8 @@ class TestComponent {
432450 @ContentChild ( TemplateRef ) contentTpl : TemplateRef ;
433451 items : any ;
434452 constructor ( ) { this . items = [ 1 , 2 ] ; }
435- customTrackBy ( index : number , item : any ) : string { return item [ 'id' ] ; }
453+ trackById ( index : number , item : any ) : string { return item [ 'id' ] ; }
454+ trackByIndex ( index : number , item : any ) : number { return index ; }
436455}
437456
438457@Component ( { selector : 'outer-cmp' } )
0 commit comments