AngularCDK菜单覆盖层位置错误
创始人
2024-10-23 13:32:04
0

问题出现的原因是菜单的位置计算有误,可以通过在组件中手动计算菜单位置来解决此问题。

首先,在组件中注入Overlay和ComponentFactoryResolver,并定义菜单触发器的位置。然后创建位置策略和显示菜单的OverlayRef,并将菜单的组件工厂解析为ComponentRef。

以下代码示例演示如何手动计算菜单位置:

component.ts:

import { Component, TemplateRef, ViewChild, ViewContainerRef, ElementRef } from '@angular/core';
import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';

@Component({
  selector: 'app-menu',
  templateUrl: './menu.component.html',
  styleUrls: ['./menu.component.scss']
})
export class MenuComponent {

  @ViewChild('trigger', {read: ElementRef}) trigger: ElementRef;
  @ViewChild('menu') menu: TemplateRef;

  private overlayRef: OverlayRef;

  constructor(private overlay: Overlay, private viewContainerRef: ViewContainerRef) {}

  openMenu() {
    if (!this.overlayRef) {
      const positionStrategy = this.overlay.position()
        .flexibleConnectedTo(this.trigger)
        .withPositions([
          {
            originX: 'start',
            originY: 'bottom',
            overlayX: 'start',
            overlayY: 'top',
            offsetY: 5
          }
        ]);

      const overlayConfig = new OverlayConfig({
        positionStrategy,
        hasBackdrop: true,
        backdropClass: 'cdk-overlay-transparent-backdrop',
        scrollStrategy: this.overlay.scrollStrategies.block()
      });

      this.overlayRef = this.overlay.create(overlayConfig);
      const menuPortal = new ComponentPortal(this.menu, this.viewContainerRef);
      const menuRef = this.overlayRef.attach(menuPortal);
      this.overlayRef.backdropClick().subscribe(() => this.overlayRef.detach());
    }
  }

}

在上述代码中,我们手动解析菜单组件并绑定位置策略,然后创建OverlayRef并显示菜单。做出这些更改之后,菜单应该正确显示在计算出的位置。

相关内容

热门资讯

Android Recycle... 要在Android RecyclerView中实现滑动卡片效果,可以按照以下步骤进行操作:首先,在项...
安装apache-beam==... 出现此错误可能是因为用户的Python版本太低,而apache-beam==2.34.0需要更高的P...
Android - 无法确定任... 这个错误通常发生在Android项目中,表示编译Debug版本的Java代码时出现了依赖关系问题。下...
Android - NDK 预... 在Android NDK的构建过程中,LOCAL_SRC_FILES只能包含一个项目。如果需要在ND...
Akka生成Actor问题 在Akka框架中,可以使用ActorSystem对象生成Actor。但是,当我们在Actor类中尝试...
Agora-RTC-React... 出现这个错误原因是因为在 React 组件中使用,import AgoraRTC from “ago...
Alertmanager在pr... 首先,在Prometheus配置文件中,确保Alertmanager URL已正确配置。例如:ale...
Aksnginxdomainb... 在AKS集群中,可以使用Nginx代理服务器实现根据域名进行路由。以下是具体步骤:部署Nginx i...
AddSingleton在.N... 在C#中创建Singleton对象通常是通过私有构造函数和静态属性来实现,例如:public cla...
Alertmanager中的基... Alertmanager中可以使用repeat_interval选项指定在一个告警重复发送前必须等待...