如何使用来自目标 div 的数据属性作为 PrimeFaces ContextMenu 结果中的视图参数

How to use a data attribute from a target div as view param in a PrimeFaces ContextMenu outcome

我正在尝试执行以下操作:

这一切看起来都很简单,直到我进行到最后一步,但我似乎无法找到一种方法来实现它。

例如

  <div class="group" data-group="GRP1">
    ...
  </div>

  <div class="group" data-group="GRP2">
    ...
  </div>

  <div class="group" data-group="GRP3">
    ...
  </div>

  <p:contextMenu targetFilter="div.group">
    <p:menuitem value="Edit" outcome="group.xhtml?group=GRP???"/>
  </p:contextMenu>

div 已生成 HTML,我对它们没有太多控制权,因此可能需要在客户端对 Javascript 做一些事情。

我试图从 Javascript 端获取该组,但我看不到如何将函数绑定到 beforeShow 处理程序。我可以看到,如果我可以注册正确的事件处理程序,那么 PF 代码会将事件传递给我(我可以从中获取目标元素和数据属性):

  // from PF menu.js
  if(this.cfg.beforeShow) {
      var retVal = this.cfg.beforeShow.call(this, e);
      if(retVal === false) {
        return;
      }
  }

但我不确定如何访问它 - 如果我只是使用内联事件注册,那么我只能传递 Javascript 代码而不是对我的函数的引用:

  function doBeforeShow(menu, event) {
    var group = event.target.dataset['group'];
  }

  <p:contextMenu targetFilter="div.group" beforeShow="/* this is just executed JS not a bound function */">

无论如何,即使我可以从 JS 端获取组,我也不确定我会用它做什么...可能将它存储在某个地方并将另一个处理程序附加到 p:menuitem所以当它被选中时它可以在调用它之前修改结果?

所以我卡住了!有人对我如何让它工作有任何想法吗?

谢谢,

得到这个工作,虽然不确定这是最好的方法...

需要 PrimeFaces 的补丁才能在菜单小部件上存储 jQuery 事件:

--- src/main/resources/META-INF/resources/primefaces/menu/menu.js       (revision 12491)
+++ src/main/resources/META-INF/resources/primefaces/menu/menu.js       (working copy)
@@ -1109,6 +1109,9 @@
             top = top - height;
         }

+        // save the event which activated this menu
+        this.jqEvent = e;
+        
         if(this.cfg.beforeShow) {
             var retVal = this.cfg.beforeShow.call(this, e);
             if(retVal === false) {

然后将 "widgetVar" 添加到 contextMenu 以命名菜单小部件和一些客户端 javascript 在激活之前更新 link:

  <p:contextMenu targetFilter="div.group" widgetVar="ctxMenu">
    <p:menuitem value="Edit" onclick="fixGroupLink(PF('ctxMenu'), this);"
        outcome="group.xhtml?group=GRP???"/>
  </p:contextMenu>

  function fixGroupLink(menu, menuitem) {
    var grp = menu.jqEvent.target.dataset.group;
    menuitem.href = menuitem.href.replace(/group=.*$/, "group=" + grp);
  }

所以这行得通,我暂时将其标记为已接受,但很高兴任何人都能提出更好的解决方案,如果他们有更好的解决方案 - 特别是不包括自定义 PrimeFaces 库的...