1
- import { AfterContentInit , ContentChild , Directive , DoCheck , ElementRef , EmbeddedViewRef , EventEmitter , Host , Inject , InjectionToken , Input , IterableDiffer , IterableDiffers , OnDestroy , Output , TemplateRef , ViewChild , ViewContainerRef , ɵisListLikeIterable as isListLikeIterable , NgZone , ɵmarkDirty , Component , ChangeDetectionStrategy } from '@angular/core' ;
2
- import { ObservableArray , View , KeyedTemplate , LayoutBase , ItemEventData , TemplatedItemsView , profile , ListView } from '@nativescript/core' ;
1
+ import { AfterContentInit , ChangeDetectionStrategy , Component , ContentChild , Directive , DoCheck , ElementRef , EmbeddedViewRef , EventEmitter , Host , HostListener , Input , IterableDiffer , IterableDiffers , NgZone , OnDestroy , Output , TemplateRef , ViewChild , ViewContainerRef , ɵisListLikeIterable as isListLikeIterable , ɵmarkDirty } from '@angular/core' ;
2
+ import { ItemEventData , KeyedTemplate , LayoutBase , ListView , ObservableArray , profile , View } from '@nativescript/core' ;
3
3
4
4
import { extractSingleViewRecursive } from '../../element-registry/registry' ;
5
5
import { NativeScriptDebug } from '../../trace' ;
@@ -15,8 +15,7 @@ export class NsTemplatedItem<T> implements NgViewTemplate<{ index: number; data:
15
15
constructor ( private template : TemplateRef < ItemContext < T > > , public location : ViewContainerRef , private onCreate ?: ( view : View ) => void ) { }
16
16
create ( context ?: { index : number ; data : T } ) : View {
17
17
const viewRef = this . location . createEmbeddedView ( this . template , context ? this . setupItemContext ( context ) : new ItemContext ( ) ) ;
18
- viewRef . detach ( ) ; // create detached
19
- viewRef . markForCheck ( ) ;
18
+ viewRef . detach ( ) ; // create detached, just beware this doesn't always work and the view might run the first CD anyway.
20
19
const resultView = getItemViewRoot ( viewRef ) ;
21
20
resultView [ NG_VIEW ] = viewRef ;
22
21
if ( this . onCreate ) {
@@ -71,6 +70,7 @@ export class NsTemplatedItem<T> implements NgViewTemplate<{ index: number; data:
71
70
72
71
export interface SetupItemViewArgs < T > {
73
72
view : EmbeddedViewRef < ItemContext < T > > ;
73
+ nativeElement : View ;
74
74
data : T ;
75
75
index : number ;
76
76
context : ItemContext < T > ;
@@ -125,8 +125,6 @@ export class ListViewComponent<T = any> implements DoCheck, OnDestroy, AfterCont
125
125
126
126
constructor ( _elementRef : ElementRef , private _iterableDiffers : IterableDiffers , private zone : NgZone ) {
127
127
this . templatedItemsView = _elementRef . nativeElement ;
128
-
129
- this . templatedItemsView . on ( 'itemLoading' , this . onItemLoading , this ) ;
130
128
}
131
129
132
130
ngAfterContentInit ( ) {
@@ -138,7 +136,6 @@ export class ListViewComponent<T = any> implements DoCheck, OnDestroy, AfterCont
138
136
}
139
137
140
138
ngOnDestroy ( ) {
141
- this . templatedItemsView . off ( 'itemLoading' , this . onItemLoading , this ) ;
142
139
this . templatedItemsView = null ;
143
140
144
141
if ( this . _templateMap ) {
@@ -166,7 +163,7 @@ export class ListViewComponent<T = any> implements DoCheck, OnDestroy, AfterCont
166
163
const templates : KeyedTemplate [ ] = [ ] ;
167
164
this . _templateMap . forEach ( ( value , key ) => {
168
165
templates . push ( {
169
- createView : value . create . bind ( value ) ,
166
+ createView : ( ) => null , // we'll handle creation later, otherwise core will create an invalid template
170
167
key,
171
168
} ) ;
172
169
} ) ;
@@ -189,6 +186,7 @@ export class ListViewComponent<T = any> implements DoCheck, OnDestroy, AfterCont
189
186
) ;
190
187
}
191
188
189
+ @HostListener ( 'itemLoading' , [ '$event' ] )
192
190
@profile
193
191
public onItemLoading ( args : ItemEventData ) {
194
192
if ( ! this . _templateMap ) {
@@ -223,15 +221,15 @@ export class ListViewComponent<T = any> implements DoCheck, OnDestroy, AfterCont
223
221
template = this . _templateMap . get ( templateKey ) ;
224
222
args . view = template . create ( { index, data : currentItem } ) ;
225
223
}
226
- this . setupViewRef ( template . getEmbeddedViewRef ( args . view ) , currentItem , index ) ;
224
+ this . setupViewRef ( template . getEmbeddedViewRef ( args . view ) , currentItem , index , args . view ) ;
227
225
228
226
template . attach ( args . view ) ;
229
227
ɵmarkDirty ( this ) ;
230
228
}
231
229
232
- public setupViewRef ( viewRef : EmbeddedViewRef < ItemContext < T > > , data : T , index : number ) : void {
230
+ public setupViewRef ( viewRef : EmbeddedViewRef < ItemContext < T > > , data : T , index : number , nativeElement : View ) : void {
233
231
const context = viewRef . context ;
234
- this . setupItemView . next ( { view : viewRef , data : data , index : index , context : context } ) ;
232
+ this . setupItemView . next ( { view : viewRef , nativeElement , data : data , index : index , context : context } ) ;
235
233
}
236
234
237
235
ngDoCheck ( ) {
0 commit comments