Skip to content

Commit 7f39e5c

Browse files
committed
refactor(core): use DebugNode instead of getDebugNode
1 parent 5eff54a commit 7f39e5c

File tree

4 files changed

+25
-55
lines changed

4 files changed

+25
-55
lines changed

Diff for: libs/core/src/lib/renderer/index.ts

+13-41
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { DOCUMENT } from '@angular/common';
22
import {
3+
DebugNode,
34
Injectable,
45
Renderer2,
56
RendererFactory2,
67
RendererType2,
7-
getDebugNode,
88
inject,
99
makeEnvironmentProviders,
1010
untracked,
@@ -99,7 +99,12 @@ export class NgtRenderer implements Renderer2 {
9999
if (this.isRoot) {
100100
this.isRoot = false;
101101
const node = createNode('three', this.rootStore.snapshot.scene, this.document);
102-
node.__ngt_renderer__[NgtRendererClassId.injectorFactory] = () => getDebugNode(element)?.injector;
102+
node.__ngt_renderer__[NgtRendererClassId.debugNodeFactory] = () => {
103+
if (!node.__ngt_renderer__[NgtRendererClassId.debugNode]) {
104+
node.__ngt_renderer__[NgtRendererClassId.debugNode] = new DebugNode(element);
105+
}
106+
return node.__ngt_renderer__[NgtRendererClassId.debugNode];
107+
};
103108
return node;
104109
}
105110

@@ -521,13 +526,15 @@ export class NgtRenderer implements Renderer2 {
521526
}
522527

523528
if (rS[NgtRendererClassId.type] === 'comment') {
524-
rS[NgtRendererClassId.injectorFactory] = null!;
529+
rS[NgtRendererClassId.debugNode] = null!;
530+
rS[NgtRendererClassId.debugNodeFactory] = null!;
525531
delete (node as NgtAnyRecord)[SPECIAL_INTERNAL_ADD_COMMENT];
526532
this.removeCommentNode(node, this.argsCommentNodes);
527533
}
528534

529535
if (rS[NgtRendererClassId.type] === 'portal') {
530-
rS[NgtRendererClassId.injectorFactory] = null!;
536+
rS[NgtRendererClassId.debugNode] = null!;
537+
rS[NgtRendererClassId.debugNodeFactory] = null!;
531538
this.removeCommentNode(node, this.portalCommentsNodes);
532539
}
533540

@@ -563,7 +570,7 @@ export class NgtRenderer implements Renderer2 {
563570
}
564571

565572
private processPortalContainer(portal: NgtRendererNode) {
566-
const injector = portal.__ngt_renderer__[NgtRendererClassId.injectorFactory]?.();
573+
const injector = portal.__ngt_renderer__[NgtRendererClassId.debugNodeFactory]?.()?.injector;
567574
if (!injector) return;
568575

569576
const portalStore = injector.get(NGT_STORE, null);
@@ -608,7 +615,7 @@ export class NgtRenderer implements Renderer2 {
608615
i--;
609616
continue;
610617
}
611-
const injector = comment.__ngt_renderer__[NgtRendererClassId.injectorFactory]();
618+
const injector = comment.__ngt_renderer__[NgtRendererClassId.debugNodeFactory]?.()?.injector;
612619
if (!injector) {
613620
i--;
614621
continue;
@@ -629,41 +636,6 @@ export class NgtRenderer implements Renderer2 {
629636
return directive;
630637
}
631638

632-
private tryGetPortalStore() {
633-
let store: NgtSignalStore<NgtState> | undefined;
634-
const destroyed = [];
635-
// we only care about the portal states because NgtStore only differs per Portal
636-
let i = this.portalCommentsNodes.length - 1;
637-
while (i >= 0) {
638-
// loop through the portal state backwards to find the closest NgtStore
639-
const portal = this.portalCommentsNodes[i];
640-
if (portal.__ngt_renderer__[NgtRendererClassId.destroyed]) {
641-
destroyed.push(i);
642-
i--;
643-
continue;
644-
}
645-
646-
const injector = portal.__ngt_renderer__[NgtRendererClassId.injectorFactory]();
647-
if (!injector) {
648-
i--;
649-
continue;
650-
}
651-
const instance = injector.get(NGT_STORE, null);
652-
// only the instance with previousRoot should pass
653-
if (instance && instance.get('previousRoot')) {
654-
store = instance;
655-
break;
656-
}
657-
i--;
658-
}
659-
660-
destroyed.forEach((index) => {
661-
this.portalCommentsNodes.splice(index, 1);
662-
});
663-
664-
return store || this.rootStore;
665-
}
666-
667639
createText = this.delegate.createText.bind(this.delegate);
668640
destroy = this.delegate.destroy.bind(this.delegate);
669641
destroyNode: ((node: any) => void) | null = null;

Diff for: libs/core/src/lib/renderer/state.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Injector, getDebugNode } from '@angular/core';
1+
import { DebugNode } from '@angular/core';
22
import { NgtAnyRecord } from '../types';
33
import { NgtRendererClassId } from './utils';
44

@@ -9,7 +9,8 @@ export type NgtRendererState = [
99
destroyed: boolean,
1010
rawValue: any,
1111
portalContainer: NgtRendererNode,
12-
injectorFactory: () => Injector | undefined,
12+
debugNode: DebugNode | undefined,
13+
debugNodeFactory: () => DebugNode | undefined,
1314
];
1415

1516
export interface NgtRendererNode {
@@ -18,7 +19,7 @@ export interface NgtRendererNode {
1819
}
1920

2021
export function createNode(type: NgtRendererState[NgtRendererClassId.type], node: NgtAnyRecord, document: Document) {
21-
const state = [type, null, [], false, undefined!, undefined!, undefined!] as NgtRendererState;
22+
const state = [type, null, [], false, undefined!, undefined!, undefined!, undefined!] as NgtRendererState;
2223

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

@@ -28,7 +29,12 @@ export function createNode(type: NgtRendererState[NgtRendererClassId.type], node
2829
// NOTE: assign injectorFactory on non-three type since
2930
// rendererNode is an instance of DOM Node
3031
if (state[NgtRendererClassId.type] !== 'three') {
31-
state[NgtRendererClassId.injectorFactory] = () => getDebugNode(rendererNode)?.injector;
32+
state[NgtRendererClassId.debugNodeFactory] = () => {
33+
if (!state[NgtRendererClassId.debugNode]) {
34+
state[NgtRendererClassId.debugNode] = new DebugNode(rendererNode as unknown as Node);
35+
}
36+
return state[NgtRendererClassId.debugNode];
37+
};
3238
}
3339

3440
return rendererNode;

Diff for: libs/core/src/lib/renderer/utils.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ export const enum NgtRendererClassId {
1414
destroyed,
1515
rawValue,
1616
portalContainer,
17-
injectorFactory,
17+
debugNode,
18+
debugNodeFactory,
1819
}
1920

2021
export function kebabToPascal(str: string): string {

Diff for: libs/core/src/lib/store.ts

-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { DOCUMENT } from '@angular/common';
21
import { ElementRef, InjectOptions, InjectionToken, effect, inject } from '@angular/core';
32
import { Subject } from 'rxjs';
43
import { Clock, Vector2, Vector3 } from 'three';
@@ -10,14 +9,6 @@ import { NgtSignalStore, signalStore } from './utils/signal-store';
109
import { updateCamera } from './utils/update';
1110

1211
function storeFactory(previousStore: NgtSignalStore<NgtState> | null) {
13-
const document = inject(DOCUMENT);
14-
const window = document.defaultView;
15-
16-
if (!window) {
17-
// TODO: revisit this when we need to support multiple platforms
18-
throw new Error(`[NGT] Window is not available.`);
19-
}
20-
2112
const loop = injectLoop();
2213

2314
// NOTE: using Subject because we do not care about late-subscribers

0 commit comments

Comments
 (0)