Skip to content

Commit 0ec724a

Browse files
committed
fix(core): move resolve parent to the directive itself
1 parent 6212118 commit 0ec724a

File tree

2 files changed

+20
-107
lines changed

2 files changed

+20
-107
lines changed

libs/core/src/lib/directives/parent.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
} from '@angular/core';
1313
import { Object3D } from 'three';
1414
import { SPECIAL_INTERNAL_ADD_COMMENT, SPECIAL_INTERNAL_SET_PARENT_COMMENT } from '../renderer/constants';
15+
import { injectStore } from '../store';
1516
import { NgtNullish } from '../types';
1617

1718
@Directive({ selector: 'ng-template[parent]' })
@@ -22,17 +23,28 @@ export class NgtParent {
2223

2324
private vcr = inject(ViewContainerRef);
2425
private template = inject(TemplateRef);
26+
private store = injectStore();
27+
private scene = this.store.select('scene');
2528

2629
protected injected = false;
27-
protected injectedParent: NgtNullish<ElementRef<Object3D> | Object3D | string> = null;
30+
protected injectedParent: NgtNullish<Object3D> = null;
2831
private view?: EmbeddedViewRef<unknown>;
2932

3033
private _parent = computed(() => {
3134
const parent = this.parent();
32-
if (typeof parent === 'function') {
33-
return parent();
35+
const rawParent = typeof parent === 'function' ? parent() : parent;
36+
if (!rawParent) return null;
37+
38+
const scene = this.scene();
39+
if (typeof rawParent === 'string') {
40+
return scene.getObjectByName(rawParent);
41+
}
42+
43+
if ('nativeElement' in rawParent) {
44+
return rawParent.nativeElement;
3445
}
35-
return parent;
46+
47+
return rawParent;
3648
});
3749

3850
constructor() {

libs/core/src/lib/renderer/index.ts

Lines changed: 4 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { DOCUMENT } from '@angular/common';
22
import {
33
DebugNode,
4-
ElementRef,
54
Injectable,
65
Renderer2,
76
RendererFactory2,
@@ -11,7 +10,6 @@ import {
1110
makeEnvironmentProviders,
1211
untracked,
1312
} from '@angular/core';
14-
import { Object3D } from 'three';
1513
import { NgtArgs } from '../directives/args';
1614
import { NgtParent } from '../directives/parent';
1715
import { getLocalState, prepare } from '../instance';
@@ -154,10 +152,7 @@ export class NgtRenderer implements Renderer2 {
154152
const primitiveNode = createNode('three', object, this.document);
155153

156154
if (injectedParent) {
157-
const resolvedParent = this.getParentFromNgtParent(injectedParent, this.rootStore);
158-
if (resolvedParent) {
159-
primitiveNode.__ngt_renderer__[NgtRendererClassId.parent] = resolvedParent as unknown as NgtRendererNode;
160-
}
155+
primitiveNode.__ngt_renderer__[NgtRendererClassId.parent] = injectedParent as unknown as NgtRendererNode;
161156
}
162157

163158
return primitiveNode;
@@ -180,10 +175,7 @@ export class NgtRenderer implements Renderer2 {
180175
}
181176

182177
if (injectedParent) {
183-
const resolvedParent = this.getParentFromNgtParent(injectedParent, this.rootStore);
184-
if (resolvedParent) {
185-
node.__ngt_renderer__[NgtRendererClassId.parent] = resolvedParent as unknown as NgtRendererNode;
186-
}
178+
node.__ngt_renderer__[NgtRendererClassId.parent] = injectedParent as unknown as NgtRendererNode;
187179
}
188180

189181
return node;
@@ -204,11 +196,8 @@ export class NgtRenderer implements Renderer2 {
204196
this.argsCommentNodes.push(comment);
205197
} else if (node === 'parent') {
206198
this.parentCommentNodes.push(comment);
207-
comment[SPECIAL_INTERNAL_SET_PARENT_COMMENT] = (ngtParent: Object3D | ElementRef<Object3D> | string) => {
208-
commentNode.__ngt_renderer__[NgtRendererClassId.parent] = this.getParentFromNgtParent(
209-
ngtParent,
210-
this.rootStore,
211-
) as unknown as NgtRendererNode;
199+
comment[SPECIAL_INTERNAL_SET_PARENT_COMMENT] = (ngtParent: NgtRendererNode) => {
200+
commentNode.__ngt_renderer__[NgtRendererClassId.parent] = ngtParent;
212201
};
213202
} else if (typeof node === 'object') {
214203
this.portalCommentsNodes.push(node);
@@ -700,94 +689,6 @@ export class NgtRenderer implements Renderer2 {
700689
return directiveInstance;
701690
}
702691

703-
private getParentFromNgtParent(ngtParent: Object3D | ElementRef<Object3D> | string, store: NgtSignalStore<NgtState>) {
704-
let topMostStore = store;
705-
706-
while (topMostStore.snapshot.previousRoot) {
707-
topMostStore = topMostStore.snapshot.previousRoot;
708-
}
709-
710-
const scene = topMostStore.snapshot.scene;
711-
712-
if (typeof ngtParent === 'string') {
713-
return scene.getObjectByName(ngtParent);
714-
}
715-
716-
if ('nativeElement' in ngtParent) {
717-
return ngtParent.nativeElement;
718-
}
719-
720-
return ngtParent;
721-
}
722-
723-
private getNgtParent() {
724-
let directive: NgtParent | undefined;
725-
726-
const destroyed = [];
727-
728-
let i = this.parentCommentNodes.length - 1;
729-
while (i >= 0) {
730-
const comment = this.parentCommentNodes[i];
731-
if (comment.__ngt_renderer__[NgtRendererClassId.destroyed]) {
732-
destroyed.push(i);
733-
i--;
734-
continue;
735-
}
736-
const injector = comment.__ngt_renderer__[NgtRendererClassId.debugNodeFactory]?.()?.injector;
737-
if (!injector) {
738-
i--;
739-
continue;
740-
}
741-
const instance = injector.get(NgtParent, null);
742-
if (instance && instance.validate()) {
743-
directive = instance;
744-
break;
745-
}
746-
747-
i--;
748-
}
749-
750-
destroyed.forEach((index) => {
751-
this.parentCommentNodes.splice(index, 1);
752-
});
753-
754-
return directive;
755-
}
756-
757-
private getNgtArgs() {
758-
let directive: NgtArgs | undefined;
759-
760-
const destroyed = [];
761-
762-
let i = this.argsCommentNodes.length - 1;
763-
while (i >= 0) {
764-
const comment = this.argsCommentNodes[i];
765-
if (comment.__ngt_renderer__[NgtRendererClassId.destroyed]) {
766-
destroyed.push(i);
767-
i--;
768-
continue;
769-
}
770-
const injector = comment.__ngt_renderer__[NgtRendererClassId.debugNodeFactory]?.()?.injector;
771-
if (!injector) {
772-
i--;
773-
continue;
774-
}
775-
const instance = injector.get(NgtArgs, null);
776-
if (instance && instance.validate()) {
777-
directive = instance;
778-
break;
779-
}
780-
781-
i--;
782-
}
783-
784-
destroyed.forEach((index) => {
785-
this.argsCommentNodes.splice(index, 1);
786-
});
787-
788-
return directive;
789-
}
790-
791692
createText = this.delegate.createText.bind(this.delegate);
792693
destroy = this.delegate.destroy.bind(this.delegate);
793694
destroyNode: ((node: any) => void) | null = null;

0 commit comments

Comments
 (0)