Skip to content

Commit e648752

Browse files
committed
fix: pass target change detector ref to listen
1 parent 5e4e18d commit e648752

File tree

2 files changed

+38
-9
lines changed

2 files changed

+38
-9
lines changed

libs/angular-three/src/lib/renderer/renderer.ts

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
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';
311
import { NGT_CATALOGUE } from '../di/catalogue';
412
import { NgtStore } from '../stores/store';
513
import { 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 (

libs/angular-three/src/lib/renderer/utils.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ export function processThreeEvent(
143143
priority: number,
144144
eventName: string,
145145
callback: (event: any) => void,
146-
cdr: ChangeDetectorRef
146+
cdr: ChangeDetectorRef,
147+
targetCdr: ChangeDetectorRef | null
147148
): () => void {
148149
const lS = getLocalState(instance);
149150
if (eventName === SPECIAL_EVENTS.BEFORE_RENDER) {
@@ -174,7 +175,7 @@ export function processThreeEvent(
174175

175176
lS.handlers = {
176177
...lS.handlers,
177-
[eventName]: eventToHandler(updatedCallback, cdr),
178+
[eventName]: eventToHandler(updatedCallback, cdr, targetCdr),
178179
};
179180
// increment the count everytime
180181
lS.eventCount += 1;
@@ -193,9 +194,14 @@ export function processThreeEvent(
193194
};
194195
}
195196

196-
export function eventToHandler(callback: (event: any) => void, cdr: ChangeDetectorRef) {
197+
export function eventToHandler(
198+
callback: (event: any) => void,
199+
cdr: ChangeDetectorRef,
200+
targetCdr: ChangeDetectorRef | null
201+
) {
197202
return (event: Parameters<Exclude<NgtEventHandlers[(typeof supportedEvents)[number]], undefined>>[0]) => {
198203
callback(event);
204+
if (targetCdr) targetCdr.detectChanges();
199205
cdr.detectChanges();
200206
};
201207
}

0 commit comments

Comments
 (0)