Я решил эту проблему, переместив стиль «высота» вверх:
[style.height]="data.origin? '5rem': dropdownHeight":
как я вижу, для ngbTypeahead, когда пользователь не выбрал ни одного элемента, data.origin не определен, поэтому я хочу, чтобы, когда пользователь выбрал какой-либо элемент из выпадающего списка, я установил высоту на минимум.
в .html файле:
<div class="form-group row" [class.has-danger]="searchFailedOrigin" [style.height]="data.origin? '5rem': dropdownHeight">
<label for="origin" class="col-sm-4 col-form-label col-form-label-sm">Origin</label>
<div class="col-sm-7 col-offset-sm-1" style="overflow-y: auto; position:relative">
<input type="text" name="origin" class="form-control form-control-sm" id="origin" [(ngModel)]="data.origin" [editable]="false" [ngbTypeahead]="searchOrigin"
[resultFormatter]="formatDropdown" [inputFormatter]="formatSelected" placeholder="Search..."/>
</div>
<div class="form-control-feedback" *ngIf="searchFailedOrigin">No Airports Found...</div>
</div>
Где dropdownHeight обновляется в файле .ts компонента в функции searchOrigin:
searchOrigin = (text$: Observable<string>) => {
.
.
.
// response is the response from server. It is a list of data filtering by "text"
this.dropdownHeight = response.data.length <= 1? `5rem`: response.data.length <= 10? `${(response.data.length + 1) * 2.56}rem`: `28rem`;
// An item in the dropdown list is 2.56rem in height
// I want the maximum height is 28rem.
.
.
.
}
Это решение может удалить уродливое пустое пространство, когда не отображается раскрывающийся список, но раскрывающийся список не перекрывает другие элементы.
Я ценю любое улучшение.