1
1
import { DOCUMENT } from '@angular/common' ;
2
- import { ChangeDetectorRef , inject , Injectable , Renderer2 , RendererFactory2 , RendererType2 } from '@angular/core' ;
2
+ import {
3
+ ChangeDetectorRef ,
4
+ getDebugNode ,
5
+ inject ,
6
+ Injectable ,
7
+ Renderer2 ,
8
+ RendererFactory2 ,
9
+ RendererType2 ,
10
+ } from '@angular/core' ;
3
11
import { NGT_CATALOGUE } from '../di/catalogue' ;
4
12
import { NgtStore } from '../stores/store' ;
5
13
import { getLocalState , prepare } from '../utils/instance' ;
@@ -72,11 +80,17 @@ export class NgtRenderer implements Renderer2 {
72
80
// on first pass, we return the Root Scene as the root node
73
81
if ( this . root && ! this . first ) {
74
82
this . first = true ;
75
- return this . store . createNode ( 'three' , this . store . rootScene ) ;
83
+ const node = this . store . createNode ( 'three' , this . store . rootScene ) ;
84
+ node . __ngt_renderer__ [ NgtRendererClassId . injectorFactory ] = ( ) => getDebugNode ( element ) ! . injector ;
85
+ return node ;
76
86
}
77
87
78
88
// handle compound
79
- if ( this . store . isCompound ( name ) ) return this . store . createNode ( 'compound' , element ) ;
89
+ if ( this . store . isCompound ( name ) ) {
90
+ const compound = this . store . createNode ( 'compound' , element ) ;
91
+ compound . __ngt_renderer__ [ NgtRendererClassId . injectorFactory ] = ( ) => getDebugNode ( element ) ! . injector ;
92
+ return compound ;
93
+ }
80
94
81
95
// handle portal
82
96
if ( name === SPECIAL_DOM_TAG . NGT_PORTAL ) {
@@ -123,7 +137,9 @@ export class NgtRenderer implements Renderer2 {
123
137
return node ;
124
138
}
125
139
126
- return this . store . createNode ( 'dom' , element ) ;
140
+ const domNode = this . store . createNode ( 'dom' , element ) ;
141
+ domNode . __ngt_renderer__ [ NgtRendererClassId . injectorFactory ] = ( ) => getDebugNode ( element ) ! . injector ;
142
+ return domNode ;
127
143
}
128
144
129
145
createComment ( value : string ) {
@@ -325,9 +341,16 @@ export class NgtRenderer implements Renderer2 {
325
341
}
326
342
327
343
listen ( target : NgtRendererNode , eventName : string , callback : ( event : any ) => boolean | void ) : ( ) => void {
344
+ const targetCdr = target . __ngt_renderer__ [ NgtRendererClassId . injectorFactory ] ?.( ) . get ( ChangeDetectorRef , null ) ;
328
345
// if target is DOM node, then we pass that to delegate Renderer
329
346
if ( this . store . isDOM ( target ) ) {
330
- return this . delegate . listen ( target , eventName , callback ) ;
347
+ const callbackWithCdr = ( event : any ) => {
348
+ const value = callback ( event ) ;
349
+ if ( targetCdr ) targetCdr . detectChanges ( ) ;
350
+ this . store . rootCdr . detectChanges ( ) ;
351
+ return value ;
352
+ } ;
353
+ return this . delegate . listen ( target , eventName , callbackWithCdr ) ;
331
354
}
332
355
333
356
if (
@@ -337,7 +360,7 @@ export class NgtRenderer implements Renderer2 {
337
360
) {
338
361
const instance = target . __ngt_renderer__ [ NgtRendererClassId . compounded ] || target ;
339
362
const priority = getLocalState ( target ) . priority ;
340
- return processThreeEvent ( instance , priority || 0 , eventName , callback , this . store . rootCdr ) ;
363
+ return processThreeEvent ( instance , priority || 0 , eventName , callback , this . store . rootCdr , targetCdr ) ;
341
364
}
342
365
343
366
if (
0 commit comments