Хорошо, я сделал форк вашего StackBlitz с решением здесь: https://stackblitz.com/edit/angular-rczreu-yqyphm
Вот основные моменты:
На вашем компоненте html, я добавил идентификатор компонента в formField:
<mat-form-field #formField class="example-full-width">
Затем на вашем компоненте ts я добавил ссылки на ViewChild для элементов Autocomplete (поле формы и сама панель Autocomplete):
@ViewChild(MatAutocompleteTrigger) autocomplete: MatAutocompleteTrigger;
@ViewChild("formField") autoCompleteFormField: MatFormField;
Затем я добавил реализацию AfterViewInit к вашему компоненту, чтобы убедиться, что элементы представления уже загружены и не являются неопределенными.
ngAfterViewInit() {
var observer = new IntersectionObserver((entries) => {
if(!entries[0].isIntersecting)
console.log('Element is is not in screen');
this.autocomplete.closePanel();
}, { threshold: [1] });
observer.observe(this.autoCompleteFormField._elementRef.nativeElement);
}
Итак, что делает этот фрагмент кода: с помощью эффективного API-интерфейса Intersection Observer, который определяет, отображается ли элемент на экране или нет. Затем просто закройте панель автозаполнения, если элемент находится за пределами экрана.
https://usefulangle.com/post/113/javascript-detecting-element-visible-during-scroll#: ~: text = To% 20know% 20whe ли% 20the% 20element% 20is% 20fully% 20visible% 20in% 20viewport, height% 20and% 20bottom% 20% 3E% 3D% 200 .