Skip to content

Commit 50a9814

Browse files
committed
feat: add args
1 parent 3e9bf47 commit 50a9814

File tree

1 file changed

+47
-0
lines changed
  • libs/angular-three/src/lib/directives

1 file changed

+47
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { Directive, EmbeddedViewRef, inject, Input, TemplateRef, ViewContainerRef } from '@angular/core';
2+
3+
@Directive({ selector: '[args]', standalone: true })
4+
export class NgtArgs {
5+
private readonly vcr = inject(ViewContainerRef);
6+
private readonly template = inject(TemplateRef);
7+
8+
constructor() {
9+
const commentNode = this.vcr.element.nativeElement;
10+
if (commentNode['__ngt_renderer_add_comment__']) {
11+
commentNode['__ngt_renderer_add_comment__']();
12+
delete commentNode['__ngt_renderer_add_comment__'];
13+
}
14+
}
15+
16+
private injectedArgs: any[] = [];
17+
private injected = false;
18+
private view?: EmbeddedViewRef<unknown>;
19+
20+
@Input() set args(args: any[] | null) {
21+
if (args == null || !Array.isArray(args)) return;
22+
if (args.length === 1 && args[0] === null) return;
23+
this.injected = false;
24+
this.injectedArgs = args;
25+
this.createView();
26+
}
27+
28+
get args() {
29+
if (this.validate()) {
30+
this.injected = true;
31+
return this.injectedArgs;
32+
}
33+
return null;
34+
}
35+
36+
validate() {
37+
return !this.injected && !!this.injectedArgs.length;
38+
}
39+
40+
private createView() {
41+
if (this.view && !this.view.destroyed) {
42+
this.view.destroy();
43+
}
44+
this.view = this.vcr.createEmbeddedView(this.template);
45+
this.view.detectChanges();
46+
}
47+
}

0 commit comments

Comments
 (0)