Search code examples
angulartypescriptangular2-template

Angular 2 dynamic template url with string variable?


 @Component({
  selector: 'bancaComponent',
  templateUrl: '{{str}}'
})
export class BancaComponent implements OnInit {
  str: String;
  constructor(private http: Http) { }
  ngOnInit(): void {
  this.str = "./file.component.html";
}

Is there another way to make it ? Thanks :)


Solution

  • Try this solution :

    import
    {
        Compiler, Component, Injector, ViewChild, NgModule, NgModuleRef,
        ViewContainerRef, AfterViewInit, OnInit
    } from '@angular/core';
    
    @Component({
        selector: 'bancaComponent',
        template: `<ng-container #dynamicTemplate></ng-container>`
        // or with a templateUrl
    })
    export class BancaComponent implements AfterViewInit, OnInit
    {
        @ViewChild('dynamicTemplate', { read: ViewContainerRef }) dynamicTemplate;
    
        constructor(
            private _compiler: Compiler,
            private _injector: Injector,
            private _m: NgModuleRef<any>)
        {
        }
    
        ngAfterViewInit()
        {
            let myTemplateUrl = './file.component.html';
    
            if (MYCONDITION === MAEXPECTATION)
            {
                myTemplateUrl = './another-template.component.html';
            }
    
            const tmpCmp = Component({
                moduleId: module.id, templateUrl: myTemplateUrl
            })(class { });
            
            const tmpModule = NgModule({ declarations: [tmpCmp] })(class { });
    
            this._compiler.compileModuleAndAllComponentsAsync(tmpModule)
                .then((factories) =>
                {
                    const f = factories.componentFactories[0];
                    const cmpRef = f.create(this._injector, [], null, this._m);
                    cmpRef.instance.name = 'dynamic';
                    this.dynamicTemplate.insert(cmpRef.hostView);
                });
        }
    }
    

    Inspired from : Angular 2/4 component with dynamic template or templateUrl

    Official source : https://angular.io/guide/dynamic-component-loader