Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit de101e9

Browse files
Chau TranChau Tran
Chau Tran
authored and
Chau Tran
committed
fix: clean up renderer
1 parent f4ebbbd commit de101e9

File tree

2 files changed

+33
-21
lines changed

2 files changed

+33
-21
lines changed

apps/documentation/docs/api/ref.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,4 @@ export type NgtInjectedRef<T> = ElementRef<T> & {
7171
/* notify this CD when ref value changes */
7272
useCDR: (cdr: ChangeDetectorRef) => void;
7373
};
74-
```title
74+
```

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

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ export class NgtRenderer implements Renderer2 {
131131
const instance = prepare(new threeTarget(...injectedArgs), { store, args: injectedArgs });
132132
const node = this.store.createNode('three', instance);
133133
const localState = getLocalState(instance);
134+
135+
// auto-attach for geometry and material
134136
if (is.geometry(instance)) {
135137
localState.attach = ['geometry'];
136138
} else if (is.material(instance)) {
@@ -243,6 +245,7 @@ export class NgtRenderer implements Renderer2 {
243245
// if child is three but haven't been attached to a parent yet
244246
(cRS[NgtRendererClassId.type] === 'three' && !getLocalState(newChild).parent) ||
245247
// or both parent and child are DOM elements
248+
// or they are compound AND haven't had a THREE instance yet
246249
((pRS[NgtRendererClassId.type] === 'dom' ||
247250
(pRS[NgtRendererClassId.type] === 'compound' && !pRS[NgtRendererClassId.compounded])) &&
248251
(cRS[NgtRendererClassId.type] === 'dom' ||
@@ -325,10 +328,10 @@ export class NgtRenderer implements Renderer2 {
325328

326329
if (rS[NgtRendererClassId.compounded].__ngt_renderer__[NgtRendererClassId.compound]) {
327330
Object.assign(rS[NgtRendererClassId.compounded].__ngt_renderer__[NgtRendererClassId.compound], {
328-
props: {
329-
...rS[NgtRendererClassId.compounded].__ngt_renderer__[NgtRendererClassId.compound],
330-
[name]: value,
331-
},
331+
props: Object.assign(
332+
rS[NgtRendererClassId.compounded].__ngt_renderer__[NgtRendererClassId.compound],
333+
{ [name]: value }
334+
),
332335
});
333336
}
334337
this.setProperty(rS[NgtRendererClassId.compounded], name, value);
@@ -341,13 +344,37 @@ export class NgtRenderer implements Renderer2 {
341344
listen(target: NgtRendererNode, eventName: string, callback: (event: any) => boolean | void): () => void {
342345
const rS = target.__ngt_renderer__;
343346
const targetCdr = rS?.[NgtRendererClassId.injectorFactory]?.().get(ChangeDetectorRef, null);
344-
// if target is DOM node, then we pass that to delegate Renderer
347+
348+
if (
349+
rS[NgtRendererClassId.type] === 'three' ||
350+
(rS[NgtRendererClassId.type] === 'compound' && rS[NgtRendererClassId.compounded])
351+
) {
352+
const instance = rS[NgtRendererClassId.compounded] || target;
353+
const priority = getLocalState(target).priority;
354+
return processThreeEvent(instance, priority || 0, eventName, callback, this.store.rootCdr, targetCdr!);
355+
}
356+
357+
if (rS[NgtRendererClassId.type] === 'compound' && !rS[NgtRendererClassId.compounded]) {
358+
this.store.queueOperation(target, [
359+
'op',
360+
() => this.store.queueOperation(target, ['cleanUp', this.listen(target, eventName, callback)]),
361+
]);
362+
}
363+
364+
// setup a new callback with CDR so that it will trigger change detection properly
345365
const callbackWithCdr = (event: any) => {
346366
const value = callback(event);
347367
safeDetectChanges(targetCdr);
348368
safeDetectChanges(this.store.rootCdr);
349369
return value;
350370
};
371+
372+
// if the target doesn't have __ngt_renderer__, we delegate
373+
if (!rS) {
374+
return this.delegate.listen(target, eventName, callbackWithCdr);
375+
}
376+
377+
// if target is DOM node, then we pass that to delegate Renderer
351378
if (this.store.isDOM(target)) {
352379
return this.delegate.listen(target, eventName, callbackWithCdr);
353380
}
@@ -366,21 +393,6 @@ export class NgtRenderer implements Renderer2 {
366393
return this.delegate.listen(eventTarget, event, callbackWithCdr);
367394
}
368395

369-
if (
370-
rS[NgtRendererClassId.type] === 'three' ||
371-
(rS[NgtRendererClassId.type] === 'compound' && rS[NgtRendererClassId.compounded])
372-
) {
373-
const instance = rS[NgtRendererClassId.compounded] || target;
374-
const priority = getLocalState(target).priority;
375-
return processThreeEvent(instance, priority || 0, eventName, callback, this.store.rootCdr, targetCdr!);
376-
}
377-
378-
if (rS[NgtRendererClassId.type] === 'compound' && !rS[NgtRendererClassId.compounded]) {
379-
this.store.queueOperation(target, [
380-
'op',
381-
() => this.store.queueOperation(target, ['cleanUp', this.listen(target, eventName, callback)]),
382-
]);
383-
}
384396
return () => {};
385397
}
386398

0 commit comments

Comments
 (0)