From 9e30852f84d3d3518d3e62a5149a854afdaddcba Mon Sep 17 00:00:00 2001 From: Nedyalko Nikolov Date: Mon, 28 Mar 2016 09:02:48 +0300 Subject: [PATCH] Added setupItemView event for Angular ListView. --- .../directives/list-view-comp.ts | 20 ++++-- tests/app/tests/list-view-tests.ts | 70 +++++++++++++++++++ 2 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 tests/app/tests/list-view-tests.ts diff --git a/src/nativescript-angular/directives/list-view-comp.ts b/src/nativescript-angular/directives/list-view-comp.ts index 89418397c..5723bf4e4 100644 --- a/src/nativescript-angular/directives/list-view-comp.ts +++ b/src/nativescript-angular/directives/list-view-comp.ts @@ -9,7 +9,10 @@ import { HostListener, IterableDiffers, IterableDiffer, - ChangeDetectorRef} from 'angular2/core'; + ChangeDetectorRef, + EventEmitter, + Output} from 'angular2/core'; +import {isListLikeIterable} from 'angular2/src/facade/collection'; import {Observable as RxObservable} from 'rxjs' import {ListView} from 'ui/list-view'; import {View} from 'ui/core/view'; @@ -18,6 +21,12 @@ import {ObservableArray} from 'data/observable-array'; import {LayoutBase} from 'ui/layouts/layout-base'; const NG_VIEW = "_ngViewRef"; +interface SetupItemViewArgs { + view: EmbeddedViewRef; + data: any; + index: number; +} + @Component({ selector: 'ListView', template: ``, @@ -28,6 +37,8 @@ export class ListViewComponent { private _items: any; private _differ: IterableDiffer; + @Output() public setupItemView: EventEmitter = new EventEmitter(); + @ContentChild(TemplateRef) itemTemplate: TemplateRef; set items(value: any) { @@ -36,7 +47,7 @@ export class ListViewComponent { if (value instanceof ObservableArray) { needDiffer = false; } - if (needDiffer && !this._differ && value) { + if (needDiffer && !this._differ && isListLikeIterable(value)) { this._differ = this._iterableDiffers.find(this._items).create(this._cdr, (index, item) => { return item;}); } this.listView.items = this._items; @@ -45,8 +56,8 @@ export class ListViewComponent { private timerId: number; private doCheckDelay = 5; - constructor(private _elementRef: ElementRef, - private _iterableDiffers: IterableDiffers, + constructor(private _elementRef: ElementRef, + private _iterableDiffers: IterableDiffers, private _cdr: ChangeDetectorRef, private _appViewManager: AppViewManager) { this.listView = _elementRef.nativeElement; @@ -82,6 +93,7 @@ export class ListViewComponent { viewRef.setLocal("index", index); viewRef.setLocal('even', (index % 2 == 0)); viewRef.setLocal('odd', (index % 2 == 1)); + this.setupItemView.next({'view': viewRef, 'data': data, 'index': index}); } ngDoCheck() { diff --git a/tests/app/tests/list-view-tests.ts b/tests/app/tests/list-view-tests.ts new file mode 100644 index 000000000..2797f8c2e --- /dev/null +++ b/tests/app/tests/list-view-tests.ts @@ -0,0 +1,70 @@ +import {assert} from "./test-config"; +import { + ElementRef, + Component +} from 'angular2/core'; +import {TestApp} from "./test-app"; + +class DataItem { + constructor(public id: number, public name: string) { } +} + +@Component({ + selector: 'list-view-setupItemView', + template: ` + + + + + + ` +}) +export class TestListViewComponent { + public myItems: Array; + public counter: number; + + constructor(public elementRef: ElementRef) { + this.counter = 0; + this.myItems = []; + for (var i = 0; i < 2; i++) { + this.myItems.push(new DataItem(i, "data item " + i)); + } + } + + onSetupItemView(args) { + this.counter++; + } +} + +describe('ListView-tests', () => { + let testApp: TestApp = null; + + before(() => { + return TestApp.create().then((app) => { + testApp = app; + }) + }); + + after(() => { + testApp.dispose(); + }); + + afterEach(() => { + testApp.disposeComponents(); + }); + + it('setupItemView is called for every item', (done) => { + return testApp.loadComponent(TestListViewComponent).then((componentRef) => { + const component = componentRef.instance; + setTimeout(() => { + assert.equal(component.counter, 2); + done(); + }, 1000); + }); + }); +}); \ No newline at end of file