【问题标题】:Custom context menu in AngularAngular 中的自定义上下文菜单
【发布时间】:2017-07-21 03:49:54
【问题描述】:

我正在尝试创建一个——看似简单——的东西——我希望能够创建一个自定义上下文菜单,该菜单显示一个“X”作为我页面上某些元素的删除选项。理想情况下,我会为这个功能使用一个外部库,而不是自己编写另一个组件,因为我试图将这个项目保存到一个组件文件中(因为我没有时间提出这个问题)。

我已经尝试过看起来很完美的库:https://github.com/isaacplmann/ngx-contextmenu,但它没有按预期工作。

菜单看起来很糟糕,无法使用,如下所示:

附加到 X 的(执行)事件永远不会触发,并且菜单显然没有按预期显示。如果有人对这不起作用的原因有所了解,这是我目前正在使用的代码:

菜单附加到的元素:

<div 
    id="playhead"
    (mousedown)="movePlayheadByMouse()"
    [contextMenu]="deleteMenu"
>
     <span id="playhead-top">&#9930;</span>
     <div id="playhead-line"></div>
</div>

菜单本身:

<context-menu #deleteMenu>
    <ng-template contextMenuItem (execute)="print('click')">X</ng-template>
</context-menu>

打印功能(只是控制台的日志)

private print(val : string) : void
{
  console.log(val)
}

这个 ngx-context-menu 组件似乎没有很多支持,所以我有兴趣尝试其他方法。所以我的问题是:

1) 您是否知道任何其他可以很好地用于此目的的自定义菜单组件库?

2) 你知道如何将 Angular Material md-menu 触发器更改为右键单击而不是左键单击吗? (这将允许我在这种情况下使用 Angular Material 的 md 菜单?)

谢谢! 拉尔斯

【问题讨论】:

  • 我不知道库,但是您是否尝试将输出绑定到组件中声明的函数?
  • 如果您指的是附加到 contextMenuItem 的(执行)事件,那么是的。似乎该事件已正确绑定,但列表被破坏了,它永远不会捕获对菜单项的点击。
  • 不知道。可能和mousedown有冲突

标签: angular angular-material contextmenu


【解决方案1】:

使用此代码 (execute)="console.log('click')" 您的处理程序将无法工作,因为在模板中,您只有可用的模板范围(不是全局范围,但 console 在全局范围内)
所以你需要从你的组件中调用一个函数,比如
(execute)="functionFromComponent('click')"

至于角材料:您可以通过这种方式添加手动触发器:

class MyComponent {
  @ViewChild(MdMenuTrigger) trigger: MdMenuTrigger;

  someMethod() {
    this.trigger.openMenu();
  }
}

然后将someMethod()绑定到正常的点击事件(并过滤掉右键点击)

另请参阅:https://material.angular.io/components/menu/overview

【讨论】:

  • 你是对的,是一个错误的例子。我已经编辑了问题,并且行为仍然存在。如果它无论如何都尝试调用 console.log,它会给我一个错误,但它从来没有这样做过,因为 (execute) 事件从未被调用。
  • 添加了角度材质的建议
  • 太棒了,谢谢!不知道我是如何在文档中错过的。这非常适合将 openMenu 函数绑定到右键单击。但是,在接受之前我还有一个问题——在文档中,它说“请注意,在这种情况下,仍然需要一个 mdMenuTriggerFor 指令来将菜单附加到 DOM 中的触发器元素。”意思是,我仍然需要绑定 mdMenuTriggerFor,它默认为左键单击(我的菜单在左键单击和右键单击时弹出)。你知道如何解决它,这样菜单就不会在左键单击时打开,只有右键单击?
  • 它应该通过阻止默认值来工作。所以在捕捉点击事件时你说:(click)="someMethod($event)" 然后在 someMethod 中你说:someMethod(event:MouseEvent){event.preventDefault(); event.stopImmediatePropagation(); event.cancleBubble=true;}
  • 该特定代码似乎不起作用,但我会尝试使用它。谢谢!
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 2016-06-06
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多