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' ;
33
44import { extractSingleViewRecursive } from '../../element-registry/registry' ;
55import { NativeScriptDebug } from '../../trace' ;
@@ -15,8 +15,7 @@ export class NsTemplatedItem<T> implements NgViewTemplate<{ index: number; data:
1515 constructor ( private template : TemplateRef < ItemContext < T > > , public location : ViewContainerRef , private onCreate ?: ( view : View ) => void ) { }
1616 create ( context ?: { index : number ; data : T } ) : View {
1717 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.
2019 const resultView = getItemViewRoot ( viewRef ) ;
2120 resultView [ NG_VIEW ] = viewRef ;
2221 if ( this . onCreate ) {
@@ -71,6 +70,7 @@ export class NsTemplatedItem<T> implements NgViewTemplate<{ index: number; data:
7170
7271export interface SetupItemViewArgs < T > {
7372 view : EmbeddedViewRef < ItemContext < T > > ;
73+ nativeElement : View ;
7474 data : T ;
7575 index : number ;
7676 context : ItemContext < T > ;
@@ -125,8 +125,6 @@ export class ListViewComponent<T = any> implements DoCheck, OnDestroy, AfterCont
125125
126126 constructor ( _elementRef : ElementRef , private _iterableDiffers : IterableDiffers , private zone : NgZone ) {
127127 this . templatedItemsView = _elementRef . nativeElement ;
128-
129- this . templatedItemsView . on ( 'itemLoading' , this . onItemLoading , this ) ;
130128 }
131129
132130 ngAfterContentInit ( ) {
@@ -138,7 +136,6 @@ export class ListViewComponent<T = any> implements DoCheck, OnDestroy, AfterCont
138136 }
139137
140138 ngOnDestroy ( ) {
141- this . templatedItemsView . off ( 'itemLoading' , this . onItemLoading , this ) ;
142139 this . templatedItemsView = null ;
143140
144141 if ( this . _templateMap ) {
@@ -166,7 +163,7 @@ export class ListViewComponent<T = any> implements DoCheck, OnDestroy, AfterCont
166163 const templates : KeyedTemplate [ ] = [ ] ;
167164 this . _templateMap . forEach ( ( value , key ) => {
168165 templates . push ( {
169- createView : value . create . bind ( value ) ,
166+ createView : ( ) => null , // we'll handle creation later, otherwise core will create an invalid template
170167 key,
171168 } ) ;
172169 } ) ;
@@ -189,6 +186,7 @@ export class ListViewComponent<T = any> implements DoCheck, OnDestroy, AfterCont
189186 ) ;
190187 }
191188
189+ @HostListener ( 'itemLoading' , [ '$event' ] )
192190 @profile
193191 public onItemLoading ( args : ItemEventData ) {
194192 if ( ! this . _templateMap ) {
@@ -223,15 +221,15 @@ export class ListViewComponent<T = any> implements DoCheck, OnDestroy, AfterCont
223221 template = this . _templateMap . get ( templateKey ) ;
224222 args . view = template . create ( { index, data : currentItem } ) ;
225223 }
226- this . setupViewRef ( template . getEmbeddedViewRef ( args . view ) , currentItem , index ) ;
224+ this . setupViewRef ( template . getEmbeddedViewRef ( args . view ) , currentItem , index , args . view ) ;
227225
228226 template . attach ( args . view ) ;
229227 ɵmarkDirty ( this ) ;
230228 }
231229
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 {
233231 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 } ) ;
235233 }
236234
237235 ngDoCheck ( ) {
0 commit comments