Search code examples
angularangular2-template

angular 5: templateRef.createEmbeddedView is not a function


Here's the code I'm trying to get to work (angular 5):

  import { Component, ViewChild, TemplateRef, ViewContainerRef } from '@angular/core';

@Component({
  selector: 'vcr',
  template: `
    <template #tpl>
      <h1>ViewContainerRef</h1>
    </template>
    <div>Some element</div>
    <div #container></div>
  `,
})
export class VcrCmp {
  @ViewChild('container', { read: ViewContainerRef }) _vcr;
  @ViewChild('tpl') tpl: TemplateRef<any>;

  constructor(
    private viewContainerRef: ViewContainerRef
  ) {

  }

  ngAfterViewInit() {
    console.info(this.viewContainerRef);
    console.info(this._vcr);

    this._vcr.createEmbeddedView(this.tpl);
    this.viewContainerRef.createEmbeddedView(this.tpl);
  }
}

The problem is that I've got this (templateRef.createEmbeddedView is not a function) error and don't really understand why.

This code is based on this example https://netbasal.com/angular-2-understanding-viewcontainerref-acc183f3b682 so I guess it should work.

What am I doing wrong?


Solution

  • According to angular 5 changelog:

    The compiler option enableLegacyTemplate is now disabled by default as the element was deprecated since v4. Use <ng-template> instead.

    So you should use ng-template instead of template:

    <ng-template #tpl>
       <h1>ViewContainerRef</h1>
    </ng-template>
    

    Stackblitz Example

    or set enableLegacyTemplate to true:

    platformBrowserDynamic().bootstrapModule(AppModule, { enableLegacyTemplate: true })
    

    Stackblitz Example

    But you should know that

    The option enableLegacyTemplate and the <template> element will both be removed in Angular v6.