Skip to content

Commit ab3ff84

Browse files
author
Nedyalko Nikolov
committed
Merge pull request #277 from NativeScript/nnikolov/ListViewCustomTemplateFix
Fixed problem with ListView in ios when CustomTemplate is used.
2 parents 70767bb + b5732a5 commit ab3ff84

File tree

2 files changed

+32
-26
lines changed

2 files changed

+32
-26
lines changed

nativescript-angular/directives/list-view-comp.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import {
1212
ChangeDetectorRef,
1313
EventEmitter,
1414
ViewChild,
15-
Output} from '@angular/core';
15+
Output,
16+
ChangeDetectionStrategy} from '@angular/core';
17+
import {isBlank} from '@angular/core/src/facade/lang';
1618
import {isListLikeIterable} from '@angular/core/src/facade/collection';
1719
import {Observable as RxObservable} from 'rxjs'
1820
import {ListView} from 'ui/list-view';
@@ -45,7 +47,8 @@ export interface SetupItemViewArgs {
4547
<DetachedContainer>
4648
<Placeholder #loader></Placeholder>
4749
</DetachedContainer>`,
48-
inputs: ['items']
50+
inputs: ['items'],
51+
changeDetection: ChangeDetectionStrategy.OnPush
4952
})
5053
export class ListViewComponent {
5154
public get nativeElement(): ListView {
@@ -97,6 +100,10 @@ export class ListViewComponent {
97100
if (args.view) {
98101
console.log("ListView.onItemLoading: " + index + " - Reusing existing view");
99102
viewRef = args.view[NG_VIEW];
103+
// getting angular view from original element (in cases when ProxyViewContainer is used NativeScript internally wraps it in a StackLayout)
104+
if (!viewRef) {
105+
viewRef = (args.view._subViews && args.view._subViews.length > 0) ? args.view._subViews[0][NG_VIEW] : undefined;
106+
}
100107
}
101108
else {
102109
console.log("ListView.onItemLoading: " + index + " - Creating view from template");
@@ -108,6 +115,9 @@ export class ListViewComponent {
108115
}
109116

110117
public setupViewRef(viewRef: EmbeddedViewRef<ListItemContext>, data: any, index: number): void {
118+
if (isBlank(viewRef)) {
119+
return;
120+
}
111121
const context = viewRef.context;
112122
context.$implicit = data;
113123
context.item = data;

ng-sample/app/examples/list/list-test.ts

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,32 @@ class DataItem {
66
constructor(public id: number, public name: string) { }
77
}
88

9-
// @Component({
10-
// selector: 'item-component',
11-
// template: `
12-
// <StackLayout [class.odd]="odd" [class.even]="even">
13-
// <Label [text]='"id: " + data.id'></Label>
14-
// <Label [text]='"name: " + data.name'></Label>
15-
// </StackLayout>
16-
// `
17-
// })
18-
// export class ItemComponent {
19-
// @Input() data: DataItem;
20-
// @Input() odd: boolean;
21-
// @Input() even: boolean;
22-
// constructor() { }
23-
// }
9+
@Component({
10+
selector: 'item-component',
11+
template: `
12+
<StackLayout [class.odd]="odd" [class.even]="even">
13+
<Label [text]='"id: " + data.id'></Label>
14+
<Label [text]='"name: " + data.name'></Label>
15+
</StackLayout>
16+
`
17+
})
18+
export class ItemComponent {
19+
@Input() data: DataItem;
20+
@Input() odd: boolean;
21+
@Input() even: boolean;
22+
constructor() { }
23+
}
2424

2525
@Component({
2626
selector: 'list-test',
27-
//directives: [ItemComponent],
27+
directives: [ItemComponent],
2828
template: `
2929
<GridLayout rows="auto, *, auto, auto">
3030
<Label row="0" text="-==START==-" fontSize="20"></Label>
3131
<GridLayout row="1">
3232
<ListView [items]="myItems" (itemTap)="onItemTap($event)">
3333
<template let-item="item" let-i="index" let-odd="odd" let-even="even">
34-
<StackLayout [class.odd]="odd" [class.even]="even">
35-
<Label [text]='"index: " + i'></Label>
36-
<Label [text]='"[" + item.id +"] " + item.name'></Label>
37-
</StackLayout>
34+
<item-component [data]="item" [odd]="odd" [even]="even"></item-component>
3835
</template>
3936
</ListView>
4037
</GridLayout>
@@ -47,12 +44,12 @@ class DataItem {
4744
`,
4845
changeDetection: ChangeDetectionStrategy.OnPush
4946
// TEMPLATE WITH COMPONENT
50-
// <template #item="item" #i="index" #odd="odd" #even="even">
47+
// <template let-item="item" let-i="index" let-odd="odd" let-even="even">
5148
// <item-component [data]="item" [odd]='odd' [even]='even'></item-component>
5249
// </template>
5350

5451
// IN-PLACE TEMPLATE
55-
// <template #item="item" #i="index" #odd="odd" #even="even">
52+
// <template let-item="item" let-i="index" let-odd="odd" let-even="even">
5653
// <StackLayout [class.odd]="odd" [class.even]="even">
5754
// <Label [text]='"index: " + i'></Label>
5855
// <Label [text]='"[" + item.id +"]" + item.name'></Label>
@@ -88,5 +85,4 @@ export class ListTest {
8885
var label = <Label>page.getViewById("testLabel");
8986
label.text = "Alabala";
9087
}
91-
}
92-
88+
}

0 commit comments

Comments
 (0)