Я работаю над своей библиотекой 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();
}
}
}