angular - ngTemplateOutlet : templateRef.createdEmbeddedView er ikke en funksjon
Jeg prøver å lage et modulært bord.
For å gjøre det, bruker jeg malreferanser og ng-beholdere.
Jeg har laget denne stackblitzen, som er ganske enkel :
https://stackblitz.com/edit/angular-2xhely
Når den kjøres, sier den feilen
TypeError: templateRef.createEmbeddedView er ikke en funksjon
Og jeg har lett på nettet en stund nå, og ser ut til å ikke finne en løsning på problemet mitt.
Her er den relaterte koden.
Direktiv
import { Directive, Input, TemplateRef } from '@angular/core';
@Directive({ selector: '[template]' })
export class TemplateDirective {
@Input() template: string;
constructor(public templateRef: TemplateRef<any>) { }
}
Rotkomponent
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `
<app-table [data]="data">
<ng-template template="body" let-item>
<td>{{item.id}}</td>
<td>{{item.nom}}</td>
</ng-template>
</app-table>`,
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
data = [{ id: 1, nom: 'Max' }];
}
Tabellkomponent
import { Component, OnInit, Input, ContentChildren, QueryList } from '@angular/core';
import { TemplateDirective } from './template.directive';
@Component({
selector: 'app-table',
template: `
<table>
<thead>
<td>ID</td>
<td>NOM</td>
</thead>
<tbody *ngIf="template">
<ng-container *ngFor="let item of data">
<ng-container *ngTemplateOutlet="template; context: { $implicit: item }">
</ng-container>
</ng-container>
</tbody>
</table>
`,
styleUrls: ['./table.component.css']
})
export class TableComponent {
@Input() data: any[];
@ContentChildren(TemplateDirective) templates: QueryList<any>;
template: TemplateDirective;
ngAfterContentInit() {
this.template = this.templates.first.template;
}
}
Rediger
Jeg har prøvd å legge malen utenfor tabellvelgeren og gi den som input til tabellen, og det ser ut til å fungere. Kan det være at du ikke kan bruke innholdsbarna til å gjøre det?
Svar #1
Hvis du oppdaterer TableComponent til dette, fungerer det. Håper dette løser problemet ditt.
<table>
<thead>
<td>ID</td>
<td>NOM</td>
</thead>
<tbody *ngIf="template">
<tr>
<ng-container *ngFor="let item of data"
[ngTemplateOutlet]="template"
[ngTemplateOutletContext]="{ $implicit: item }">
</ng-container>
</tr>
</tbody>
</table>
<ng-template #template let-item>
<td>{{item?.id}}</td>
<td>{{item?.nom}}</td>
</ng-template>