Андрей, когда вы определяете cdk-overly, вы выбираете positionStrategy. Порядок позиций определяется в массиве withPositions. Вы можете увидеть эту ссылку (я не знаю, устарела она или нет): netanet базальное наложение cdk (на самом деле cdk-наложение материала Angular очень плохое), что я пытаюсь просто сделать в этом SO
Обычно вы импортируете оверлей и overlayPositionBuilder
constructor(public overlay: Overlay)
Вы создаете overLayRef, используя create
const overlayRef = overlay.create();
Функция create - это объект типа OverlayConfig со свойствами: Высота, ширина, maxWidth, .. и (среди прочего) positionStrategy, то есть объект типа PositionStrategy
Итак, сначала вы создаете объект типа PositionStrategy. Для этого вы можете использовать метод position()
наложения
Этот объект имеет метод flexibleConnectedTo
Вы можете выбрать «подключено» к ElementRef | HTMLElement | Точка & {ширина ?: число; высота ?: число;};
это возвращает FlexibleConnectedPositionStrategy , который вы можете присвоить значение позициям (массив ConnectionPositionPair ), либо напрямую, либо используя метод withPositions
, поэтому , например,
const positionStrategy = this.overlayPositionBuilder
.flexibleConnectedTo({ x, y })
.withPositions([{
originX: 'center',
originY: 'top',
overlayX: 'center',
overlayY: 'bottom',
},
{
originX: 'center',
originY: 'bottom',
overlayX: 'center',
overlayY: 'top',
}]);
попробуйте сначала присоединиться к вершине, но если места недостаточно, используйте вторую заданную позицию
Обновить
Ну, конечная позиция может быть заключена в setTimeout () после выполнения присоединения, например,
//After attach
this.overlayRef.attach(new TemplatePortal(menu, viewContainerRef, {
$implicit: data, close:this.close
}));
//enclosed in a setTimeout() we has this.overlayRef.overlayElement
setTimeout(()=>{
console.log(this.overlayRef.overlayElement.getBoundingClientRect())
})