11import { 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' ;
311import { NGT_CATALOGUE } from '../di/catalogue' ;
412import { NgtStore } from '../stores/store' ;
513import { getLocalState , prepare } from '../utils/instance' ;
@@ -72,11 +80,17 @@ export class NgtRenderer implements Renderer2 {
7280 // on first pass, we return the Root Scene as the root node
7381 if ( this . root && ! this . first ) {
7482 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 ;
7686 }
7787
7888 // 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+ }
8094
8195 // handle portal
8296 if ( name === SPECIAL_DOM_TAG . NGT_PORTAL ) {
@@ -123,7 +137,9 @@ export class NgtRenderer implements Renderer2 {
123137 return node ;
124138 }
125139
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 ;
127143 }
128144
129145 createComment ( value : string ) {
@@ -325,9 +341,16 @@ export class NgtRenderer implements Renderer2 {
325341 }
326342
327343 listen ( target : NgtRendererNode , eventName : string , callback : ( event : any ) => boolean | void ) : ( ) => void {
344+ const targetCdr = target . __ngt_renderer__ [ NgtRendererClassId . injectorFactory ] ?.( ) . get ( ChangeDetectorRef , null ) ;
328345 // if target is DOM node, then we pass that to delegate Renderer
329346 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 ) ;
331354 }
332355
333356 if (
@@ -337,7 +360,7 @@ export class NgtRenderer implements Renderer2 {
337360 ) {
338361 const instance = target . __ngt_renderer__ [ NgtRendererClassId . compounded ] || target ;
339362 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 ) ;
341364 }
342365
343366 if (
0 commit comments