typescript - Wie zwingt man ein im "let"-Clause im HTML Angular-Template deklariertes Element?
Ich habe eine Komponente, die es ermöglicht, eine mat-table zu rendern. Für jede Zelle kann man den Wert angeben oder, falls vorhanden, ruft die Komponente einen ngTemplateOutlet auf und übergibt eine Rendering-Funktion, die vom aufrufenden Objekt abgerufen wird.
export interface ColumnConfig {
name: string;
headerTemplate?: TemplateRef<Element>;
headerLabel?: string;
headerClasses?:string;
bodyTemplate?: TemplateRef<Element>;
bodyClasses?:string;
visible?: boolean;
align?: string;
}
<mat-cell mat-cell *matCellDef="let element">
<ng-container *ngIf="!column.bodyTemplate; else bodyTemplate">
{{ element[column.name] }}
</ng-container>
<ng-template #bodyTemplate [ngTemplateOutlet]="column.bodyTemplate!" [ngTemplateOutletContext]="{ $implicit: element }"></ng-template>
</mat-cell>
Ich habe kürzlich viele Projektabhängigkeiten aktualisiert (TypeScript, Angular, TSLint->ESLint, ...) und jetzt erhalte ich den folgenden Fehler, der zuvor nicht aufgetreten ist.
Object literal may only specify known properties, and '"$implicit"' does not exist in type 'Element'.
Ich verstehe nicht, wie man das Element tippt, das durch das "let" von "matCellDef" definiert wird.
Danke!
Antwort #1
Ich habe es gelöst, indem ich die Definition von ngTemplateOutletContext in eine TS-Methode verschoben habe:
<mat-cell mat-cell *matCellDef="let element">
<ng-container *ngIf="!column.bodyTemplate; else bodyTemplate">
{{ element[column.name] }}
</ng-container>
<ng-template #bodyTemplate [ngTemplateOutlet]="column.bodyTemplate!" [ngTemplateOutletContext]="generateContext(element)"></ng-template>
</mat-cell>
Hier der TS-Fragment:
public generateContext(element:any):any{
return {
$implicit: element
};
}
Wenn jemand wüsste, wie man das nur mit den HTML-Definitionen macht, würde ich es gerne ändern.
Antwort #2
Ich denke, das könnte funktionieren
<mat-cell mat-cell *matCellDef="let element">
<ng-container *ngIf="!column.bodyTemplate; else bodyTemplate" [ngTemplateOutlet]="bodyTemplate" [ngTemplateOutletContext]="{ element: element }">
{{ element[column.name] }}
</ng-container>
<ng-template #bodyTemplate let-element="element">
...
</ng-template>
</mat-cell>
