angular - 使用 mat-menu 作为上下文菜单 : getting the positioning right

标签 angular angular-material2

我正在尝试使用 mat-menu 构建上下文菜单,我觉得我已经很接近了。我希望菜单在用户右键单击的位置弹出。问题是它是在用户上次右击的地方弹出的,而不是他们当前右击的地方。我该如何解决这个问题?

HTML:

<span #contextMenuTrigger [matMenuTriggerFor]="contextMenu" class="context-menu-trigger" [style.left.px]="menuLeft" [style.top.px]="menuTop"></span>
<div (contextmenu)="openContextMenu($event)> stuff that I want right-click available to goes here</div>
<mat-menu #contextMenu="matMenu"> 
    <button mat-menu-item>Item 1</button>
    <button mat-menu-item>Item 2</button>
</mat-menu>

CSS:

.context-menu-trigger { position: absolute }

TS:

...
@Component( ... )
export class AppComponent {
    @ViewChild(MatMenuTrigger) public menuTrigger : MatMenuTrigger;
    public menuLeft = 0;
    public menuTop = 0;
    ...
    openContextMenu(event) {
        event.preventDefault();
        this.menuLeft = event.x;
        this.menuTop = event.y;
        this.menuTrigger.openMenu();
    }
}

我们目前使用@angular 4.4 和@angular/material 2.0.0-beta.12。

最佳答案

依赖超时是不安全的。 为您的跨度触发器设置直接样式以获取即时位置更新:

<span style="position:fixed;" #spanTrigger class="context-menu-trigger" #matTrigger="matMenuTrigger" [matMenuTriggerFor]="contextMenu"></span>
<div (contextmenu)="openContextMenu($event, matTrigger, spanTrigger)> stuff that I want right-click available to goes here</div>
<mat-menu #contextMenu="matMenu"> 
    <button mat-menu-item>Item 1</button>
    <button mat-menu-item>Item 2</button>
</mat-menu>

处理程序:

 openContextMenu(
    event: MouseEvent,
    trigger: MatMenuTrigger,
    triggerElement: HTMLElement
  ) {
    triggerElement.style.left = event.clientX + 5 + "px";
    triggerElement.style.top = event.clientY + 5 + "px";
    if (trigger.menuOpen) {
      trigger.closeMenu();
      trigger.openMenu();
    } else {
      trigger.openMenu();
    }
    event.preventDefault();
  }

关于angular - 使用 mat-menu 作为上下文菜单 : getting the positioning right,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48412085/

相关文章:

Angular 项目结构最佳实践

angular - 在 Angular 2 中过滤数组之前,如何设置 i=index of array?

angular - 拒绝后 CanActivate Promise<boolean> 不通过 url 导航

angular - 尝试填充对象列表时出现错误 Cannot find a different support object '[object Object]' of type 'object'

forms - 输入类型编号 "only numeric value"验证

javascript - Angular Material 2 选项卡动态内容

angular - 清除 ngx-mat-select-search 的选定值

angular5 - 带有 Angular Material 的 Angular 5 - 按钮波纹效果不起作用

angular - 错误 : @angular/material/material has no exported member 'MdButtonModule'

css - 如何使用 Material 在同一行中制作图标和占位符?