feat(ngFor): Support convenience view local in ngFor

Closes #8013
This commit is contained in:
Gion Kunz 2016-01-16 16:37:44 +01:00 committed by Alex Rickabaugh
parent fb2773b8f3
commit ccff17599a
2 changed files with 22 additions and 0 deletions

View File

@ -26,6 +26,8 @@ import {BaseException} from "../../facade/exceptions";
* `NgFor` provides several exported values that can be aliased to local variables: * `NgFor` provides several exported values that can be aliased to local variables:
* *
* * `index` will be set to the current loop iteration for each template context. * * `index` will be set to the current loop iteration for each template context.
* * `first` will be set to a boolean value indicating whether the item is the first one in the
* iteration.
* * `last` will be set to a boolean value indicating whether the item is the last one in the * * `last` will be set to a boolean value indicating whether the item is the last one in the
* iteration. * iteration.
* * `even` will be set to a boolean value indicating whether this item has an even index. * * `even` will be set to a boolean value indicating whether this item has an even index.
@ -126,6 +128,7 @@ export class NgFor implements DoCheck {
for (var i = 0, ilen = this._viewContainer.length; i < ilen; i++) { for (var i = 0, ilen = this._viewContainer.length; i < ilen; i++) {
var viewRef = <EmbeddedViewRef>this._viewContainer.get(i); var viewRef = <EmbeddedViewRef>this._viewContainer.get(i);
viewRef.setLocal('first', i === 0);
viewRef.setLocal('last', i === ilen - 1); viewRef.setLocal('last', i === ilen - 1);
} }

View File

@ -298,6 +298,25 @@ export function main() {
}); });
})); }));
it('should display first item correctly',
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
var template =
'<div><copy-me template="ngFor: var item of items; var isFirst=first">{{isFirst.toString()}}</copy-me></div>';
tcb.overrideTemplate(TestComponent, template)
.createAsync(TestComponent)
.then((fixture) => {
fixture.debugElement.componentInstance.items = [0, 1, 2];
fixture.detectChanges();
expect(fixture.debugElement.nativeElement).toHaveText('truefalsefalse');
fixture.debugElement.componentInstance.items = [2, 1];
fixture.detectChanges();
expect(fixture.debugElement.nativeElement).toHaveText('truefalse');
async.done();
});
}));
it('should display last item correctly', it('should display last item correctly',
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => { inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
var template = var template =