С помощью ответа D Pro я обнаружил, что мне действительно не нужно использовать ngTemplateOutlet
в моем случае (они кажутся действительно сложными для чего-то столь же простого, как я использовал).
Мое окончательное решение:
машинопись
export class A {
}
export class B {
}
export class MyComponent
implements OnInit {
public controlsTypes$ = Observable<any[]>([]);
ngOnInit() {
var value1 = new A();
var value2 = new B();
this.controls$.next([
{ control: value1, type: getTypeName(value1)},
{ control: value2, type: getTypeName(value2)},
]);
}
public getTypeName(control: any) {
if (control instanceof A) {
return "AControl";
} else if (control instanceof B) {
return "BControl";
}
return "";
}
public onClick(control: any) {
}
}
html:
<div *ngFor="let controlType of controlType$ | async"
[ngSwitch]="controlType.type">
<ng-template ngSwitchCase="AControl">
<div (click)="onClick(controlType.control)">{{ controlType.type }}</div>
</ng-template>
<ng-template ngSwitchCase="BControl">
<div (click)="onClick(controlType.control)">{{ controlType.type }}</div>
</ng-template>
</div>
Показывает AControl
и BControl
ипри нажатии каждого из них экземпляр класса передается в onClick()
.