Я вижу, что ваши "поля" являются реальными JavaScript классом, инициализированным, например, new LargeText (...)
, поэтому в этом случае я думаю, что вашим лучшим другом является оператор instanceof . Кстати, эта ссылка не прекратится после сборки продукта.
Что-то выглядит так:
шаблон
<input *ngIf="isSmallText(inputField)">
<textarea *ngIf="isLargeText(inputField)"></textarea>
компонент
public isSmallText(field: SmallText | LargeText): boolean {
return field instanceof SmallText;
}
public isLargeText(field: SmallText | LargeText): boolean {
return field instanceof LargeText;
}
Также, как указал @chris, у людей могут возникнуть проблемы с использованием вызовов методов в шаблоне Angular, поскольку это вызывает обнаружение изменений больше, чем ожидаемые обновления в этом фрагменте кода шаблона. (случай может отличаться в зависимости от вашей стратегии обнаружения изменения компонентов)
Ниже приведен пример более готового кода (все еще используется instanceof
)
template
<input *ngIf="isSmallText$ | async">
<textarea *ngIf="isLargeText$ | async"></textarea>
компонент
// your field observable monitored when input changes
public inputField$ = ...;
public isSmallText$ = this.inputField$.map(field => field instanceof SmallText);
public isLargeText$ = this.inputField$.map(field => field instanceof LargeText);
И, конечно, когда ваша бизнес-логика c становится более сложной (например, дюжина полей различного типа), вы Я захочу немного изменить рефакторинг для единой проверки этих типов, но это будет выходить за рамки первоначальной проблемы, которую вы хотите решить здесь.
Но ИМХО жертва производительности это то, что стоит принять, когда вы только начали изучать Angular. Это естественно go исчезнет, когда вы запачкаете руки в реактивном программировании.