Я работаю над своей библиотекой Contexr. Я только что отредактировал свое приложение, чтобы использовать Angular CDK Overlay для отображения контекстного меню, поэтому мне больше не нужно включать какой-либо компонент в фактическое приложение (на один шаг установки меньше).
Однажды я использовал FlexibleConnectedPositionStrategy, чтобы создать раскрывающийся список под элементом, который будет находиться внутри страницы. Эта позиционная стратегия создается так же, как при использовании ElementRef:
const positionStrategy = this.overlay.position()
.flexibleConnectedTo(elementRef)
.left(state.left + 'px')
.top(state.top + 'px');
Проблема в том, что у меня нет ElementRef, от которого можно было бы перейти. Мой оверлей должен гибко подключаться к моим .left () и .top (). Есть ли способ сделать это с помощью FlexibleConnectedPositionStrategy? В настоящее время я пытаюсь использовать GlobalPositionStrategy, но это не учитывает элементы, выходящие за пределы экрана.
Класс, открывающий оверлей:
@Injectable({
providedIn: 'root'
})
export class ContextMenuService {
private overlayRef: OverlayRef;
constructor(private overlay: Overlay, private injector: Injector) {}
public open(state: ContextState) {
const overlayConfig = this.getOverlayConfig(state);
this.overlayRef = this.overlay.create(overlayConfig);
const contextMenuRef = new ContextMenuOverlayRef(this.overlayRef);
this.attachDialogContainer(this.overlayRef, state, contextMenuRef);
}
private getOverlayConfig(state: ContextState) {
const positionStrategy = this.overlay.position()
.global()
.left(state.left + 'px')
.top(state.top + 'px');
return {
positionStrategy: positionStrategy
};
}
private createInjector(state: ContextState, dialogRef: ContextMenuOverlayRef) {
const injectionTokens = new WeakMap();
injectionTokens.set(ContextMenuOverlayRef, dialogRef);
injectionTokens.set(CONTEXT_MENU_OVERLAY_DATA, state);
return new PortalInjector(this.injector, injectionTokens);
}
private attachDialogContainer(overlayRef: OverlayRef, state: ContextState, contextMenuOverlayRef: ContextMenuOverlayRef) {
const injector = this.createInjector(state, contextMenuOverlayRef);
const containerPortal = new ComponentPortal(ContextMenuComponent, null, injector);
overlayRef.attach(containerPortal);
}
public close() {
if (this.overlayRef) {
this.overlayRef.dispose();
}
}
}