Skip to content

Commit 4322bec

Browse files
committed
fix: use Document as ownerDocument for renderer node that does not have ownerDocument yet
1 parent 1dd5064 commit 4322bec

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { DOCUMENT } from '@angular/common';
12
import { ChangeDetectorRef, inject, Injectable, Renderer2, RendererFactory2, RendererType2 } from '@angular/core';
23
import { NGT_CATALOGUE } from '../di/catalogue';
34
import { NgtStore } from '../stores/store';
@@ -15,6 +16,7 @@ export class NgtRendererFactory implements RendererFactory2 {
1516
private readonly store = inject(NgtStore);
1617
private readonly catalogue = inject(NGT_CATALOGUE);
1718
private readonly compoundPrefixes = inject(NGT_COMPOUND_PREFIXES);
19+
private readonly document = inject(DOCUMENT);
1820

1921
private rendererMap = new Map<string, Renderer2>();
2022

@@ -30,6 +32,7 @@ export class NgtRendererFactory implements RendererFactory2 {
3032
store: this.store,
3133
cdr: this.cdr,
3234
compoundPrefixes: this.compoundPrefixes,
35+
document: this.document,
3336
});
3437
renderer = new NgtRenderer(delegateRenderer, store, this.catalogue, true);
3538
this.rendererMap.set(type.id, renderer);
@@ -40,6 +43,7 @@ export class NgtRendererFactory implements RendererFactory2 {
4043
store: this.store,
4144
cdr: this.cdr,
4245
compoundPrefixes: this.compoundPrefixes,
46+
document: this.document,
4347
});
4448
renderer = new NgtRenderer(delegateRenderer, store, this.catalogue);
4549
this.rendererMap.set(type.id, renderer);
@@ -318,6 +322,11 @@ export class NgtRenderer implements Renderer2 {
318322
}
319323

320324
listen(target: NgtRendererNode, eventName: string, callback: (event: any) => boolean | void): () => void {
325+
// if target is Document (DOM), then we pass that to delegate Renderer
326+
if (this.store.isDocument(target)) {
327+
return this.delegate.listen(target, eventName, callback);
328+
}
329+
321330
if (
322331
target.__ngt_renderer__[NgtRendererClassId.type] === 'three' ||
323332
(target.__ngt_renderer__[NgtRendererClassId.type] === 'compound' &&

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export type NgtRendererRootState = {
1212
store: NgtStore;
1313
cdr: ChangeDetectorRef;
1414
compoundPrefixes: string[];
15+
document: Document;
1516
};
1617

1718
export type NgtQueueOp = [type: 'op' | 'cleanUp', op: () => void, done?: true];
@@ -63,6 +64,11 @@ export class NgtRendererStore {
6364

6465
const rendererNode = Object.assign(node, { __ngt_renderer__: state });
6566

67+
// assign ownerDocument to node so we can use HostListener in Component
68+
if (!rendererNode['ownerDocument']) {
69+
rendererNode['ownerDocument'] = this.root.document;
70+
}
71+
6672
if (state[NgtRendererClassId.type] === 'comment') {
6773
state[NgtRendererClassId.injectorFactory] = () => getDebugNode(rendererNode)!.injector;
6874
// we attach an arrow function to the Comment node
@@ -241,6 +247,10 @@ export class NgtRendererStore {
241247
return this.root.compoundPrefixes.some((prefix) => name.startsWith(prefix));
242248
}
243249

250+
isDocument(node: NgtAnyRecord) {
251+
return node === this.root.document;
252+
}
253+
244254
get rootScene() {
245255
return this.root.store.get('scene');
246256
}

0 commit comments

Comments
 (0)