@@ -24,12 +24,8 @@ import {View} from 'ui/core/view';
24
24
import { NgView } from '../view-util' ;
25
25
import { ObservableArray } from 'data/observable-array' ;
26
26
import { LayoutBase } from 'ui/layouts/layout-base' ;
27
- < < < << << 2 b36449d70d559d1fda6cdf4d271246b5fe0ecd2
28
- import { rendererLog , rendererError } from "../trace" ;
29
- = === ===
30
- import 'rxjs/add/operator/debounceTime' ;
27
+ import { listViewLog } from "../trace" ;
31
28
32
- > >>> >>> Manually trigger change detection onItemLoading for current item only
33
29
const NG_VIEW = "_ngViewRef" ;
34
30
35
31
export class ListItemContext {
@@ -111,23 +107,22 @@ export class ListViewComponent implements DoCheck, OnDestroy {
111
107
let viewRef : EmbeddedViewRef < ListItemContext > ;
112
108
113
109
if ( args . view ) {
114
- log ( "ListView.onItemLoading: " + index + " - Reusing existing view" ) ;
115
-
110
+ listViewLog ( "onItemLoading: " + index + " - Reusing existing view" ) ;
116
111
viewRef = args . view [ NG_VIEW ] ;
117
112
// getting angular view from original element (in cases when ProxyViewContainer is used NativeScript internally wraps it in a StackLayout)
118
113
if ( ! viewRef ) {
119
114
viewRef = ( args . view . _subViews && args . view . _subViews . length > 0 ) ? args . view . _subViews [ 0 ] [ NG_VIEW ] : undefined ;
120
115
}
121
116
}
122
117
else {
123
- log ( "ListView. onItemLoading: " + index + " - Creating view from template" ) ;
118
+ listViewLog ( " onItemLoading: " + index + " - Creating view from template" ) ;
124
119
viewRef = this . loader . createEmbeddedView ( this . itemTemplate , new ListItemContext ( ) , 0 ) ;
125
120
args . view = getSingleViewFromViewRef ( viewRef ) ;
126
121
args . view [ NG_VIEW ] = viewRef ;
127
122
}
128
123
this . setupViewRef ( viewRef , currentItem , index ) ;
129
124
130
- this . detectChangesOnChild ( viewRef ) ;
125
+ this . detectChangesOnChild ( viewRef , index ) ;
131
126
}
132
127
133
128
public setupViewRef ( viewRef : EmbeddedViewRef < ListItemContext > , data : any , index : number ) : void {
@@ -144,65 +139,60 @@ export class ListViewComponent implements DoCheck, OnDestroy {
144
139
this . setupItemView . next ( { view : viewRef , data : data , index : index , context : context } ) ;
145
140
}
146
141
147
- private detectChangesOnChild ( viewRef : EmbeddedViewRef < ListItemContext > ) {
142
+ private detectChangesOnChild ( viewRef : EmbeddedViewRef < ListItemContext > , index : number ) {
148
143
// Manually detect changes in view ref
149
- var childCD = < ChangeDetectorRef > ( < any > viewRef ) ;
150
- var childView = ( < any > viewRef ) . _view ;
151
-
152
- log ( "------------ detectChanges START ----------" )
153
- log ( "CangeDetectionState child before mark " + this . logCD ( childView ) ) ;
154
- childCD . markForCheck ( ) ;
155
- childCD . detectChanges ( ) ;
156
- log ( "CangeDetectionState child after detect " + this . logCD ( childView ) ) ;
157
- log ( "------------ detectChanges END ----------" )
158
- }
159
-
160
- private logCD ( cdr : any ) {
161
- var modes = [ "CheckOnce" , "Checked" , "CheckAlways" , "Detached" , "OnPush" , "Default" ] ;
162
- var states = [ "Never" , "CheckedBefore" , "Error" ] ;
163
- return "Mode: " + modes [ parseInt ( cdr . cdMode ) ] + " State: " + states [ parseInt ( cdr . cdState ) ] ;
144
+ //
145
+ const childChangeDetector = < ChangeDetectorRef > ( < any > viewRef ) ;
146
+
147
+ listViewLog ( "Manually detect changes in child: " + index )
148
+ // listViewLog("CangeDetectionState child before mark " + getChangeDetectorState((<any>viewRef)._view));
149
+ childChangeDetector . markForCheck ( ) ;
150
+ childChangeDetector . detectChanges ( ) ;
151
+ // listViewLog("CangeDetectionState child after detect " + getChangeDetectorState((<any>viewRef)._view));
164
152
}
165
153
166
154
ngDoCheck ( ) {
167
155
if ( this . _differ ) {
168
- log ( "======> ngDoCheck() DIFFER ")
169
- var changes = this . _differ . diff ( this . _items ) ;
156
+ listViewLog ( " ngDoCheck() - execute differ ")
157
+ const changes = this . _differ . diff ( this . _items ) ;
170
158
if ( changes ) {
171
- log ( "======> ngDoCheck() REFRESH" )
172
- // this._cdr.detach();
159
+ listViewLog ( "ngDoCheck() - refresh" )
173
160
this . listView . refresh ( ) ;
174
161
}
175
162
}
176
163
}
177
164
}
178
165
179
- function log ( msg ) {
180
- // console.log(msg);
181
- }
182
166
183
- function getSingleViewFromViewRef ( viewRef : EmbeddedViewRef < any > ) : View {
184
- var getSingleViewRecursive = ( nodes : Array < any > , nestLevel : number ) => {
185
- var actualNodes = nodes . filter ( ( n ) => ! ! n && n . nodeName !== "#text" ) ;
167
+ function getSingleViewRecursive ( nodes : Array < any > , nestLevel : number ) {
168
+ const actualNodes = nodes . filter ( ( n ) => ! ! n && n . nodeName !== "#text" ) ;
186
169
187
- if ( actualNodes . length === 0 ) {
188
- throw new Error ( "No suitable views found in list template! Nesting level: " + nestLevel ) ;
189
- }
190
- else if ( actualNodes . length > 1 ) {
191
- throw new Error ( "More than one view found in list template! Nesting level: " + nestLevel ) ;
170
+ if ( actualNodes . length === 0 ) {
171
+ throw new Error ( "No suitable views found in list template! Nesting level: " + nestLevel ) ;
172
+ }
173
+ else if ( actualNodes . length > 1 ) {
174
+ throw new Error ( "More than one view found in list template! Nesting level: " + nestLevel ) ;
175
+ }
176
+ else {
177
+ if ( actualNodes [ 0 ] ) {
178
+ let parentLayout = actualNodes [ 0 ] . parent ;
179
+ if ( parentLayout instanceof LayoutBase ) {
180
+ parentLayout . removeChild ( actualNodes [ 0 ] ) ;
181
+ }
182
+ return actualNodes [ 0 ] ;
192
183
}
193
184
else {
194
- if ( actualNodes [ 0 ] ) {
195
- let parentLayout = actualNodes [ 0 ] . parent ;
196
- if ( parentLayout instanceof LayoutBase ) {
197
- parentLayout . removeChild ( actualNodes [ 0 ] ) ;
198
- }
199
- return actualNodes [ 0 ] ;
200
- }
201
- else {
202
- return getSingleViewRecursive ( actualNodes [ 0 ] . children , nestLevel + 1 )
203
- }
185
+ return getSingleViewRecursive ( actualNodes [ 0 ] . children , nestLevel + 1 )
204
186
}
205
187
}
188
+ }
206
189
190
+ function getSingleViewFromViewRef ( viewRef : EmbeddedViewRef < any > ) : View {
207
191
return getSingleViewRecursive ( viewRef . rootNodes , 0 ) ;
208
192
}
193
+
194
+ const changeDetectorMode = [ "CheckOnce" , "Checked" , "CheckAlways" , "Detached" , "OnPush" , "Default" ] ;
195
+ const changeDetectorStates = [ "Never" , "CheckedBefore" , "Error" ] ;
196
+ function getChangeDetectorState ( cdr : any ) {
197
+ return "Mode: " + changeDetectorMode [ parseInt ( cdr . cdMode ) ] + " State: " + changeDetectorStates [ parseInt ( cdr . cdState ) ] ;
198
+ }
0 commit comments