@@ -14,20 +14,15 @@ import { NgtArgs } from '../directives/args';
14
14
import { NgtCommonDirective } from '../directives/common' ;
15
15
import { NgtParent } from '../directives/parent' ;
16
16
import { getInstanceState , prepare } from '../instance' ;
17
- import {
18
- NgtAnyRecord ,
19
- NgtConstructorRepresentation ,
20
- NgtEventHandlers ,
21
- NgtInstanceNode ,
22
- NgtInstanceState ,
23
- } from '../types' ;
17
+ import { NgtConstructorRepresentation , NgtEventHandlers , NgtInstanceNode , NgtInstanceState } from '../types' ;
24
18
import { applyProps } from '../utils/apply-props' ;
25
19
import { is } from '../utils/is' ;
26
20
import { injectCatalogue } from './catalogue' ;
27
21
import {
28
22
NGT_CANVAS_CONTENT_FLAG ,
23
+ NGT_DELEGATE_RENDERER_DESTROY_NODE_PATCHED_FLAG ,
29
24
NGT_DOM_PARENT_FLAG ,
30
- NGT_GET_NODE_ATTRIBUTE_FLAG ,
25
+ NGT_HTML_FLAG ,
31
26
NGT_INTERNAL_ADD_COMMENT_FLAG ,
32
27
NGT_INTERNAL_SET_PARENT_COMMENT_FLAG ,
33
28
NGT_PORTAL_CONTENT_FLAG ,
@@ -41,7 +36,7 @@ import {
41
36
NgtRendererNode ,
42
37
setRendererParentNode ,
43
38
} from './state' ;
44
- import { attachThreeNodes , kebabToPascal , NgtRendererClassId , removeThreeChild } from './utils' ;
39
+ import { attachThreeNodes , internalDestroyNode , kebabToPascal , NgtRendererClassId , removeThreeChild } from './utils' ;
45
40
46
41
@Injectable ( )
47
42
export class NgtRendererFactory2 implements RendererFactory2 {
@@ -59,13 +54,30 @@ export class NgtRendererFactory2 implements RendererFactory2 {
59
54
if ( ! type ) return delegateRenderer ;
60
55
61
56
let renderer = this . rendererMap . get ( type . id ) ;
62
-
63
57
if ( renderer ) return renderer ;
64
58
65
59
if ( hostElement && ! isRendererNode ( hostElement ) ) {
66
60
createRendererNode ( 'platform' , hostElement , this . document ) ;
67
61
}
68
62
63
+ if ( Reflect . get ( type , 'type' ) ?. [ NGT_HTML_FLAG ] ) {
64
+ this . rendererMap . set ( type . id , delegateRenderer ) ;
65
+
66
+ // patch delegate destroyNode so we can destroy this HTML node
67
+ // TODO: make sure we really need to do this
68
+ const originalDestroyNode = delegateRenderer . destroyNode ?. bind ( delegateRenderer ) ;
69
+ if ( ! originalDestroyNode || ! ( NGT_DELEGATE_RENDERER_DESTROY_NODE_PATCHED_FLAG in originalDestroyNode ) ) {
70
+ delegateRenderer . destroyNode = ( node ) => {
71
+ originalDestroyNode ?.( node ) ;
72
+ if ( node !== hostElement ) return ;
73
+ internalDestroyNode ( node , null ) ;
74
+ } ;
75
+ Object . assign ( delegateRenderer . destroyNode , { [ NGT_DELEGATE_RENDERER_DESTROY_NODE_PATCHED_FLAG ] : true } ) ;
76
+ }
77
+
78
+ return delegateRenderer ;
79
+ }
80
+
69
81
this . rendererMap . set ( type . id , ( renderer = new NgtRenderer2 ( delegateRenderer , this . catalogue , this . document ) ) ) ;
70
82
return renderer ;
71
83
@@ -292,71 +304,7 @@ export class NgtRenderer2 implements Renderer2 {
292
304
}
293
305
294
306
destroyNode : ( node : NgtRendererNode ) => void = ( node ) => {
295
- const rS = node . __ngt_renderer__ ;
296
- if ( ! rS || rS [ NgtRendererClassId . destroyed ] ) return ;
297
-
298
- for ( const child of rS [ NgtRendererClassId . children ] . slice ( ) ) {
299
- this . removeChild ( node , child ) ;
300
- this . destroyNode ( child ) ;
301
- }
302
-
303
- // clear out parent if haven't
304
- rS [ NgtRendererClassId . parent ] = undefined ;
305
- // clear out children
306
- rS [ NgtRendererClassId . children ] . length = 0 ;
307
-
308
- // clear out NgtInstanceState
309
- const iS = getInstanceState ( node ) ;
310
- if ( iS ) {
311
- const temp = iS as NgtAnyRecord ;
312
-
313
- iS . removeInteraction ?.( iS . store ) ;
314
-
315
- delete temp [ 'onAttach' ] ;
316
- delete temp [ 'onUpdate' ] ;
317
- delete temp [ 'object' ] ;
318
- delete temp [ 'objects' ] ;
319
- delete temp [ 'nonObjects' ] ;
320
- delete temp [ 'parent' ] ;
321
- delete temp [ 'add' ] ;
322
- delete temp [ 'remove' ] ;
323
- delete temp [ 'updateGeometryStamp' ] ;
324
- delete temp [ 'setParent' ] ;
325
- delete temp [ 'store' ] ;
326
- delete temp [ 'handlers' ] ;
327
- delete temp [ 'hierarchyStore' ] ;
328
- delete temp [ 'previousAttach' ] ;
329
- delete temp [ 'setPointerEvent' ] ;
330
- delete temp [ 'addInteraction' ] ;
331
- delete temp [ 'removeInteraction' ] ;
332
-
333
- if ( iS . type !== 'ngt-primitive' ) {
334
- delete node [ '__ngt__' ] ;
335
- }
336
- }
337
-
338
- // clear our debugNode
339
- rS [ NgtRendererClassId . injector ] = undefined ;
340
-
341
- if ( rS [ NgtRendererClassId . type ] === 'comment' ) {
342
- delete node [ NGT_INTERNAL_ADD_COMMENT_FLAG ] ;
343
- delete node [ NGT_INTERNAL_SET_PARENT_COMMENT_FLAG ] ;
344
- delete node [ NGT_CANVAS_CONTENT_FLAG ] ;
345
- delete node [ NGT_PORTAL_CONTENT_FLAG ] ;
346
- delete node [ NGT_DOM_PARENT_FLAG ] ;
347
- }
348
-
349
- // clear getAttribute if exist
350
- if (
351
- 'getAttribute' in node &&
352
- typeof node [ 'getAttribute' ] === 'function' &&
353
- node [ 'getAttribute' ] [ NGT_GET_NODE_ATTRIBUTE_FLAG ]
354
- ) {
355
- delete node [ 'getAttribute' ] ;
356
- }
357
-
358
- // mark node as destroyed
359
- rS [ NgtRendererClassId . destroyed ] = true ;
307
+ internalDestroyNode ( node , this . removeChild . bind ( this ) ) ;
360
308
} ;
361
309
362
310
appendChild ( parent : NgtRendererNode , newChild : NgtRendererNode , refChild ?: NgtRendererNode , isMove ?: boolean ) : void {
0 commit comments