вы можете использовать событие (openChange) для изменения высоты панели выбора с помощью Renderer2
Thats, in. html
<mat-select #select (openedChange)="changeHeight($event,select)">
<mat-option>...</mat-option>
<mat-option>...</mat-option>
</mat-select>
Сначала в вашем .ts inject in constructor Renderer2
constructor(private renderer:Renderer2){}
И ваша функция changeHeight
changeHeight(event:any,element:any)
{
if (event)
{
//get the height of the "screen"
const height = window.innerHeight||
document.documentElement.clientHeight||
document.body.clientHeight;
//the max-height will be the height of the screen - the position of pannel
// - 10 px (you can change this last one)
this.renderer.setStyle(element.panel.nativeElement,
'max-height',
(height-10-element.panel.nativeElement.getBoundingClientRect().y)+'px')
}
}
Вы можете увидеть в этот stackblitz
Вы также можете сделать директиву
@Directive({
selector: "[autosize]"
})
export class AutosizeDirective {
@HostListener("openedChange", ["$event"])
changeHeight(event: any) {
if (event) {
const height =
window.innerHeight ||
document.documentElement.clientHeight ||
document.body.clientHeight;
this.renderer.setStyle(
this.select.panel.nativeElement,
"max-height",
(height -10 -this.select.panel.nativeElement.getBoundingClientRect().y) +"px");
}
}
constructor(@Host() private select: MatSelect, private renderer: Renderer2) {}
}
И используйте как
<mat-select autosize>
<mat-option *ngFor="let food of foods" [value]="food.value">
{{food.viewValue}}
</mat-option>
</mat-select>
См. другой stackblitz