@@ -45,7 +45,7 @@ export class NgtRendererFactory implements RendererFactory2 {
45
45
compoundPrefixes : this . compoundPrefixes ,
46
46
document : this . document ,
47
47
} ) ;
48
- renderer = new NgtRenderer ( delegateRenderer , store , this . catalogue , true ) ;
48
+ renderer = new NgtRenderer ( delegateRenderer , store , this . catalogue ) ;
49
49
this . rendererMap . set ( type . id , renderer ) ;
50
50
}
51
51
@@ -57,40 +57,38 @@ export class NgtRendererFactory implements RendererFactory2 {
57
57
compoundPrefixes : this . compoundPrefixes ,
58
58
document : this . document ,
59
59
} ) ;
60
- renderer = new NgtRenderer ( delegateRenderer , store , this . catalogue ) ;
60
+ renderer = new NgtRenderer ( delegateRenderer , store , this . catalogue , false ) ;
61
61
this . rendererMap . set ( type . id , renderer ) ;
62
62
}
63
63
64
64
return renderer ;
65
65
}
66
66
}
67
67
68
+ /**
69
+ * Anything abbreviated with rS/RS stands for RendererState
70
+ */
68
71
export class NgtRenderer implements Renderer2 {
69
- private first = false ;
70
-
71
72
constructor (
72
73
private readonly delegate : Renderer2 ,
73
74
private readonly store : NgtRendererStore ,
74
75
private readonly catalogue : Record < string , new ( ...args : any [ ] ) => any > ,
75
- private readonly root = false
76
+ private readonly first = true
76
77
) { }
77
78
78
79
createElement ( name : string , namespace ?: string | null | undefined ) {
79
80
const element = this . delegate . createElement ( name , namespace ) ;
80
81
81
82
// on first pass, we return the Root Scene as the root node
82
- if ( this . root && ! this . first ) {
83
- this . first = true ;
83
+ if ( this . first ) {
84
84
const node = this . store . createNode ( 'three' , this . store . rootScene ) ;
85
85
node . __ngt_renderer__ [ NgtRendererClassId . injectorFactory ] = ( ) => getDebugNode ( element ) ! . injector ;
86
86
return node ;
87
87
}
88
88
89
89
// handle compound
90
90
if ( this . store . isCompound ( name ) ) {
91
- const compound = this . store . createNode ( 'compound' , element ) ;
92
- compound . __ngt_renderer__ [ NgtRendererClassId . injectorFactory ] = ( ) => getDebugNode ( element ) ! . injector ;
93
- return compound ;
91
+ return this . store . createNode ( 'compound' , element ) ;
94
92
}
95
93
96
94
// handle portal
@@ -137,21 +135,20 @@ export class NgtRenderer implements Renderer2 {
137
135
return node ;
138
136
}
139
137
140
- const domNode = this . store . createNode ( 'dom' , element ) ;
141
- domNode . __ngt_renderer__ [ NgtRendererClassId . injectorFactory ] = ( ) => getDebugNode ( element ) ! . injector ;
142
- return domNode ;
138
+ return this . store . createNode ( 'dom' , element ) ;
143
139
}
144
140
145
141
createComment ( value : string ) {
146
- const comment = this . delegate . createComment ( value ) ;
147
- return this . store . createNode ( 'comment' , comment ) ;
142
+ return this . store . createNode ( 'comment' , this . delegate . createComment ( value ) ) ;
148
143
}
149
144
150
145
appendChild ( parent : NgtRendererNode , newChild : NgtRendererNode ) : void {
151
146
// TODO: just ignore text node for now
152
147
if ( newChild instanceof Text ) return ;
148
+ const cRS = newChild . __ngt_renderer__ ;
149
+ const pRS = parent . __ngt_renderer__ ;
153
150
154
- if ( newChild . __ngt_renderer__ [ NgtRendererClassId . type ] === 'comment' ) {
151
+ if ( cRS [ NgtRendererClassId . type ] === 'comment' ) {
155
152
this . store . setParent ( newChild , parent ) ;
156
153
return ;
157
154
}
@@ -160,95 +157,78 @@ export class NgtRenderer implements Renderer2 {
160
157
this . store . addChild ( parent , newChild ) ;
161
158
162
159
// if new child is a portal
163
- if ( newChild . __ngt_renderer__ [ NgtRendererClassId . type ] === 'portal' ) {
160
+ if ( cRS [ NgtRendererClassId . type ] === 'portal' ) {
164
161
this . store . processPortalContainer ( newChild ) ;
165
- if ( newChild . __ngt_renderer__ [ NgtRendererClassId . portalContainer ] ) {
166
- this . appendChild ( parent , newChild . __ngt_renderer__ [ NgtRendererClassId . portalContainer ] ) ;
162
+ if ( cRS [ NgtRendererClassId . portalContainer ] ) {
163
+ this . appendChild ( parent , cRS [ NgtRendererClassId . portalContainer ] ) ;
167
164
}
168
165
return ;
169
166
}
170
167
171
168
// if parent is a portal
172
- if ( parent . __ngt_renderer__ [ NgtRendererClassId . type ] === 'portal' ) {
169
+ if ( pRS [ NgtRendererClassId . type ] === 'portal' ) {
173
170
this . store . processPortalContainer ( parent ) ;
174
- if ( parent . __ngt_renderer__ [ NgtRendererClassId . portalContainer ] ) {
175
- this . appendChild ( parent . __ngt_renderer__ [ NgtRendererClassId . portalContainer ] , newChild ) ;
171
+ if ( pRS [ NgtRendererClassId . portalContainer ] ) {
172
+ this . appendChild ( pRS [ NgtRendererClassId . portalContainer ] , newChild ) ;
176
173
}
177
174
return ;
178
175
}
179
176
180
177
// if both are three instances, straightforward case
181
- if (
182
- parent . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three' &&
183
- newChild . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three'
184
- ) {
178
+ if ( pRS [ NgtRendererClassId . type ] === 'three' && cRS [ NgtRendererClassId . type ] === 'three' ) {
185
179
// if child already attached to a parent, skip
186
180
if ( getLocalState ( newChild ) . parent ) return ;
187
181
// attach THREE child
188
182
attachThreeChild ( parent , newChild ) ;
189
183
// here, we handle the special case of if the parent has a compoundParent, which means this child is part of a compound parent template
190
- if ( ! newChild . __ngt_renderer__ [ NgtRendererClassId . compound ] ) return ;
184
+ if ( ! cRS [ NgtRendererClassId . compound ] ) return ;
191
185
const closestGrandparentWithCompound = this . store . getClosestParentWithCompound ( parent ) ;
192
186
if ( ! closestGrandparentWithCompound ) return ;
193
187
this . appendChild ( closestGrandparentWithCompound , newChild ) ;
194
188
return ;
195
189
}
196
190
197
191
// if only the parent is the THREE instance
198
- if ( parent . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three' ) {
199
- if ( newChild . __ngt_renderer__ [ NgtRendererClassId . children ] . length ) {
200
- for ( const renderChild of newChild . __ngt_renderer__ [ NgtRendererClassId . children ] ) {
201
- this . appendChild ( parent , renderChild ) ;
202
- }
192
+ if ( pRS [ NgtRendererClassId . type ] === 'three' ) {
193
+ for ( const renderChild of cRS [ NgtRendererClassId . children ] ) {
194
+ this . appendChild ( parent , renderChild ) ;
203
195
}
204
196
}
205
197
206
198
// if parent is a compound
207
- if ( parent . __ngt_renderer__ [ NgtRendererClassId . type ] === 'compound' ) {
199
+ if ( pRS [ NgtRendererClassId . type ] === 'compound' ) {
208
200
// if compound doesn't have a THREE instance set yet
209
- if (
210
- ! parent . __ngt_renderer__ [ NgtRendererClassId . compounded ] &&
211
- newChild . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three'
212
- ) {
201
+ if ( ! pRS [ NgtRendererClassId . compounded ] && cRS [ NgtRendererClassId . type ] === 'three' ) {
213
202
// if child is indeed an ngtCompound
214
- if ( newChild . __ngt_renderer__ [ NgtRendererClassId . compound ] ) {
215
- this . store . setCompound ( parent , newChild ) ;
216
- } else {
217
- // if not, we track the parent (that is supposedly the compound component) on this three instance
218
- if ( ! newChild . __ngt_renderer__ [ NgtRendererClassId . compoundParent ] ) {
219
- newChild . __ngt_renderer__ [ NgtRendererClassId . compoundParent ] = parent ;
220
- }
221
- }
203
+ if ( cRS [ NgtRendererClassId . compound ] ) this . store . setCompound ( parent , newChild ) ;
204
+ // if not, we track the parent (that is supposedly the compound component) on this three instance
205
+ else if ( ! cRS [ NgtRendererClassId . compoundParent ] ) cRS [ NgtRendererClassId . compoundParent ] = parent ;
222
206
}
223
207
224
208
// reset the compound if it's changed
225
209
if (
226
- parent . __ngt_renderer__ [ NgtRendererClassId . compounded ] &&
227
- newChild . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three' &&
228
- newChild . __ngt_renderer__ [ NgtRendererClassId . compound ] &&
229
- parent . __ngt_renderer__ [ NgtRendererClassId . compounded ] !== newChild
210
+ pRS [ NgtRendererClassId . compounded ] &&
211
+ cRS [ NgtRendererClassId . type ] === 'three' &&
212
+ cRS [ NgtRendererClassId . compound ] &&
213
+ pRS [ NgtRendererClassId . compounded ] !== newChild
230
214
) {
231
215
this . store . setCompound ( parent , newChild ) ;
232
216
}
233
217
}
234
218
235
219
const shouldFindGrandparentInstance =
236
220
// if child is three but haven't been attached to a parent yet
237
- ( newChild . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three' && ! getLocalState ( newChild ) . parent ) ||
221
+ ( cRS [ NgtRendererClassId . type ] === 'three' && ! getLocalState ( newChild ) . parent ) ||
238
222
// or both parent and child are DOM elements
239
- ( ( parent . __ngt_renderer__ [ NgtRendererClassId . type ] === 'dom' ||
240
- ( parent . __ngt_renderer__ [ NgtRendererClassId . type ] === 'compound' &&
241
- ! parent . __ngt_renderer__ [ NgtRendererClassId . compounded ] ) ) &&
242
- ( newChild . __ngt_renderer__ [ NgtRendererClassId . type ] === 'dom' ||
243
- ( newChild . __ngt_renderer__ [ NgtRendererClassId . type ] === 'compound' &&
244
- ! newChild . __ngt_renderer__ [ NgtRendererClassId . compounded ] ) ) ) ;
223
+ ( ( pRS [ NgtRendererClassId . type ] === 'dom' ||
224
+ ( pRS [ NgtRendererClassId . type ] === 'compound' && ! pRS [ NgtRendererClassId . compounded ] ) ) &&
225
+ ( cRS [ NgtRendererClassId . type ] === 'dom' ||
226
+ ( cRS [ NgtRendererClassId . type ] === 'compound' && ! cRS [ NgtRendererClassId . compounded ] ) ) ) ;
245
227
246
228
if ( shouldFindGrandparentInstance ) {
247
229
// we'll try to get the grandparent instance here so that we can run appendChild with both instances
248
230
const closestGrandparentInstance = this . store . getClosestParentWithInstance ( parent ) ;
249
- if ( closestGrandparentInstance ) {
250
- this . appendChild ( closestGrandparentInstance , newChild ) ;
251
- }
231
+ if ( closestGrandparentInstance ) this . appendChild ( closestGrandparentInstance , newChild ) ;
252
232
}
253
233
}
254
234
@@ -264,94 +244,80 @@ export class NgtRenderer implements Renderer2 {
264
244
}
265
245
266
246
removeChild ( parent : NgtRendererNode , oldChild : NgtRendererNode , isHostElement ?: boolean | undefined ) : void {
267
- if (
268
- parent . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three' &&
269
- oldChild . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three'
270
- ) {
247
+ const pRS = parent . __ngt_renderer__ ;
248
+ const cRS = oldChild . __ngt_renderer__ ;
249
+ if ( pRS [ NgtRendererClassId . type ] === 'three' && cRS [ NgtRendererClassId . type ] === 'three' ) {
271
250
removeThreeChild ( parent , oldChild , true ) ;
272
251
this . store . destroy ( oldChild , parent ) ;
273
252
return ;
274
253
}
275
254
276
- if (
277
- parent . __ngt_renderer__ [ NgtRendererClassId . type ] === 'compound' &&
278
- parent . __ngt_renderer__ [ NgtRendererClassId . parent ]
279
- ) {
280
- this . removeChild ( parent . __ngt_renderer__ [ NgtRendererClassId . parent ] , oldChild , isHostElement ) ;
255
+ if ( pRS [ NgtRendererClassId . type ] === 'compound' && pRS [ NgtRendererClassId . parent ] ) {
256
+ this . removeChild ( pRS [ NgtRendererClassId . parent ] , oldChild , isHostElement ) ;
281
257
return ;
282
258
}
283
259
284
- if ( parent . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three' ) {
260
+ if ( pRS [ NgtRendererClassId . type ] === 'three' ) {
285
261
this . store . destroy ( oldChild , parent ) ;
286
262
return ;
287
263
}
288
264
289
265
const closestGrandparentInstance = this . store . getClosestParentWithInstance ( parent ) ;
290
- if ( closestGrandparentInstance ) {
291
- this . removeChild ( closestGrandparentInstance , oldChild , isHostElement ) ;
292
- }
266
+ if ( closestGrandparentInstance ) this . removeChild ( closestGrandparentInstance , oldChild , isHostElement ) ;
293
267
this . store . destroy ( oldChild , closestGrandparentInstance as NgtRendererNode ) ;
294
268
}
295
269
296
270
parentNode ( node : NgtRendererNode ) {
297
- if ( node . __ngt_renderer__ ?. [ NgtRendererClassId . parent ] ) return node . __ngt_renderer__ [ NgtRendererClassId . parent ] ;
271
+ const rS = node . __ngt_renderer__ ;
272
+ if ( rS ?. [ NgtRendererClassId . parent ] ) return rS [ NgtRendererClassId . parent ] ;
298
273
return this . delegate . parentNode ( node ) ;
299
274
}
300
275
301
276
setAttribute ( el : NgtRendererNode , name : string , value : string , namespace ?: string | null | undefined ) : void {
302
- if ( el . __ngt_renderer__ [ NgtRendererClassId . type ] === 'compound' ) {
277
+ const rS = el . __ngt_renderer__ ;
278
+ if ( rS [ NgtRendererClassId . type ] === 'compound' ) {
303
279
// we don't have the compound instance yet
304
- el . __ngt_renderer__ [ NgtRendererClassId . attributes ] [ name ] = value ;
305
- if ( ! el . __ngt_renderer__ [ NgtRendererClassId . compounded ] ) {
280
+ rS [ NgtRendererClassId . attributes ] [ name ] = value ;
281
+ if ( ! rS [ NgtRendererClassId . compounded ] ) {
306
282
this . store . queueOperation ( el , [ 'op' , ( ) => this . setAttribute ( el , name , value , namespace ) ] ) ;
307
283
return ;
308
284
}
309
285
310
- this . setAttribute ( el . __ngt_renderer__ [ NgtRendererClassId . compounded ] , name , value , namespace ) ;
286
+ this . setAttribute ( rS [ NgtRendererClassId . compounded ] , name , value , namespace ) ;
311
287
return ;
312
288
}
313
289
314
- if ( el . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three' ) {
315
- this . store . applyAttribute ( el , name , value ) ;
316
- }
290
+ if ( rS [ NgtRendererClassId . type ] === 'three' ) this . store . applyAttribute ( el , name , value ) ;
317
291
}
318
292
319
293
setProperty ( el : NgtRendererNode , name : string , value : any ) : void {
320
- if ( el . __ngt_renderer__ [ NgtRendererClassId . type ] === 'compound' ) {
294
+ const rS = el . __ngt_renderer__ ;
295
+ if ( rS [ NgtRendererClassId . type ] === 'compound' ) {
321
296
// we don't have the compound instance yet
322
- el . __ngt_renderer__ [ NgtRendererClassId . properties ] [ name ] = value ;
323
- if ( ! el . __ngt_renderer__ [ NgtRendererClassId . compounded ] ) {
297
+ rS [ NgtRendererClassId . properties ] [ name ] = value ;
298
+ if ( ! rS [ NgtRendererClassId . compounded ] ) {
324
299
this . store . queueOperation ( el , [ 'op' , ( ) => this . setProperty ( el , name , value ) ] ) ;
325
300
return ;
326
301
}
327
302
328
- if ( el . __ngt_renderer__ [ NgtRendererClassId . compounded ] . __ngt_renderer__ [ NgtRendererClassId . compound ] ) {
329
- Object . assign (
330
- el . __ngt_renderer__ [ NgtRendererClassId . compounded ] . __ngt_renderer__ [ NgtRendererClassId . compound ] ,
331
- {
332
- props : {
333
- ...el . __ngt_renderer__ [ NgtRendererClassId . compounded ] . __ngt_renderer__ [
334
- NgtRendererClassId . compound
335
- ] ,
336
- [ name ] : value ,
337
- } ,
338
- }
339
- ) ;
303
+ if ( rS [ NgtRendererClassId . compounded ] . __ngt_renderer__ [ NgtRendererClassId . compound ] ) {
304
+ Object . assign ( rS [ NgtRendererClassId . compounded ] . __ngt_renderer__ [ NgtRendererClassId . compound ] , {
305
+ props : {
306
+ ...rS [ NgtRendererClassId . compounded ] . __ngt_renderer__ [ NgtRendererClassId . compound ] ,
307
+ [ name ] : value ,
308
+ } ,
309
+ } ) ;
340
310
}
341
- this . setProperty ( el . __ngt_renderer__ [ NgtRendererClassId . compounded ] , name , value ) ;
311
+ this . setProperty ( rS [ NgtRendererClassId . compounded ] , name , value ) ;
342
312
return ;
343
313
}
344
314
345
- if ( el . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three' ) {
346
- this . store . applyProperty ( el , name , value ) ;
347
- }
315
+ if ( rS [ NgtRendererClassId . type ] === 'three' ) this . store . applyProperty ( el , name , value ) ;
348
316
}
349
317
350
318
listen ( target : NgtRendererNode , eventName : string , callback : ( event : any ) => boolean | void ) : ( ) => void {
351
- const targetCdr = target . __ngt_renderer__ ?. [ NgtRendererClassId . injectorFactory ] ?.( ) . get (
352
- ChangeDetectorRef ,
353
- null
354
- ) ;
319
+ const rS = target . __ngt_renderer__ ;
320
+ const targetCdr = rS ?. [ NgtRendererClassId . injectorFactory ] ?.( ) . get ( ChangeDetectorRef , null ) ;
355
321
// if target is DOM node, then we pass that to delegate Renderer
356
322
const callbackWithCdr = ( event : any ) => {
357
323
const value = callback ( event ) ;
@@ -378,19 +344,15 @@ export class NgtRenderer implements Renderer2 {
378
344
}
379
345
380
346
if (
381
- target . __ngt_renderer__ [ NgtRendererClassId . type ] === 'three' ||
382
- ( target . __ngt_renderer__ [ NgtRendererClassId . type ] === 'compound' &&
383
- target . __ngt_renderer__ [ NgtRendererClassId . compounded ] )
347
+ rS [ NgtRendererClassId . type ] === 'three' ||
348
+ ( rS [ NgtRendererClassId . type ] === 'compound' && rS [ NgtRendererClassId . compounded ] )
384
349
) {
385
- const instance = target . __ngt_renderer__ [ NgtRendererClassId . compounded ] || target ;
350
+ const instance = rS [ NgtRendererClassId . compounded ] || target ;
386
351
const priority = getLocalState ( target ) . priority ;
387
352
return processThreeEvent ( instance , priority || 0 , eventName , callback , this . store . rootCdr , targetCdr ! ) ;
388
353
}
389
354
390
- if (
391
- target . __ngt_renderer__ [ NgtRendererClassId . type ] === 'compound' &&
392
- ! target . __ngt_renderer__ [ NgtRendererClassId . compounded ]
393
- ) {
355
+ if ( rS [ NgtRendererClassId . type ] === 'compound' && ! rS [ NgtRendererClassId . compounded ] ) {
394
356
this . store . queueOperation ( target , [
395
357
'op' ,
396
358
( ) => this . store . queueOperation ( target , [ 'cleanUp' , this . listen ( target , eventName , callback ) ] ) ,
@@ -399,9 +361,6 @@ export class NgtRenderer implements Renderer2 {
399
361
return ( ) => { } ;
400
362
}
401
363
402
- get data ( ) : { [ key : string ] : any } {
403
- return this . delegate . data ;
404
- }
405
364
createText = this . delegate . createText . bind ( this . delegate ) ;
406
365
destroy = this . delegate . destroy . bind ( this . delegate ) ;
407
366
destroyNode : ( ( node : any ) => void ) | null = null ;
@@ -413,4 +372,7 @@ export class NgtRenderer implements Renderer2 {
413
372
setStyle = this . delegate . setStyle . bind ( this . delegate ) ;
414
373
removeStyle = this . delegate . removeStyle . bind ( this . delegate ) ;
415
374
setValue = this . delegate . setValue . bind ( this . delegate ) ;
375
+ get data ( ) : { [ key : string ] : any } {
376
+ return this . delegate . data ;
377
+ }
416
378
}
0 commit comments