There is a possibility to bind standalone directives to component and directive decorator since angular version 15. Is there a way how to use structural directive (injecting templateRef) as hostDirective? It would be super usefull, but as I try anyhow I always get No provider for TemplateRef.
CodePudding user response:
In your provided demo, you are using a standalone directive into a no-standalone component, in this case HelloComponent is contained in AppModule, so in order to use your directive, you would need to import into the imports array, like if it were a module
@NgModule({
imports: [BrowserModule, FormsModule, MyIfDirective], // directive here
declarations: [AppComponent, HelloComponent],
bootstrap: [AppComponent],
})
export class AppModule {}
If HelloComponent were standalone, then you would require to import it into the component's metadata imports array.
CodePudding user response:
you need make changes in directive.ts, don't declare TemplateRef in constructor rather declare it in directive class:
import {
Directive,
Injectable,
TemplateRef,
ViewContainerRef,
} from '@angular/core';
@Injectable({
providedIn: 'root',
})
@Directive({
selector: '[myIf]',
standalone: true,
})
export class MyIfDirective {
tpl: TemplateRef<any>
constructor( private vcr: ViewContainerRef) {}
ngOnInit() {
this.vcr.createEmbeddedView(this.tpl);
}
}
you can refer to this stackblitz link, I have made changes in directive.ts: https://stackblitz.com/edit/angular-ivy-host-directive-uw5wkq
