Primefaces DataTable的列特定上下文菜单

roo*_*kit 8 datatable jsf contextmenu primefaces jsf-2

如何在Primefaces数据表中为每列定义上下文菜单?放在<p:contextMenu>里面<p:column>不能正常工作.我希望上下文菜单不同,具体取决于右键单击的列用户.

这不起作用(为所有列创建的上下文菜单相同):

<p:dataTable value="#{values}" var="value" selectionMode="single" selection="#{selectedValue}" id="table">
    <p:column headerText="Col 1">
        <h:outputText value="#{value.balance}">
            <f:convertNumber type="currency"></f:convertNumber>
        </h:outputText>
        <p:contextMenu>
            <p:menuitem value="Report"></p:menuitem>
            <p:menuitem value="Change"></p:menuitem>
        </p:contextMenu>
    </p:column>
    <p:column headerText="col 2" >
        <h:outputText value="#{value.balance2}">
            <f:convertNumber type="currency"></f:convertNumber>
        </h:outputText>
    <p:contextMenu>
        <p:menuitem value="Something else"></p:menuitem>
    </p:contextMenu>
    </p:column>
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)

如何通过使用PF组件,扩展PF组件或添加自定义JavaScript在Primefaces dataTable中添加特定于列的上下文菜单?

Ron*_*yen 6

您是否尝试过(我刚刚使用Primefaces 3.5测试过):ContextMenu可以附加到任何JSF组件,primefaces datatable中的每一行都有私有和动态id(例如:carList:0:test1:carList:1:test1 .. .),所以我认为你应该使用contextMenu里面的列:

                 <p:column headerText="Model">  
                    <p:panel id="test1">
                        <h:outputText value="#{carr.model}" />
                        <p:contextMenu for="test1" widgetVar="cMenu">
                            <p:menuitem value="Edit Cell" icon="ui-icon-search"
                                        onclick="product.showCellEditor();return false;" />
                            <p:menuitem value="Hide Menu" icon="ui-icon-close"
                                        onclick="cMenu.hide()" />
                        </p:contextMenu>
                    </p:panel>
                </p:column>  
                <p:column headerText="MANUFAC" style="width:20%">  
                    <p:panel id="test2">
                        <h:outputText value="#{carr.manufacturer}" />
                        <p:contextMenu for="test2" widgetVar="cMenu2">
                            <p:menuitem value="Edit Cell" icon="ui-icon-search"
                                        onclick="product.showCellEditor();return false;" />
                            <p:menuitem value="Hide Menu" icon="ui-icon-close"
                                        onclick="cMenu2.hide()" />
                            <p:menuitem value="Hide Menu" icon="ui-icon-close"
                                        onclick="cMenu2.hide()" />
                        </p:contextMenu>
                    </p:panel>
                </p:column>
Run Code Online (Sandbox Code Playgroud)

如果要指定行:

<p:column headerText="Model" style="width:30%">  
                    <p:panel id="test1">
                        <h:outputText value="#{carr.model}" />
                        <p:contextMenu rendered="#{carr.model eq 'SENT'}" for="test1" widgetVar="cMenu">
                            <p:menuitem value="Edit Cell" icon="ui-icon-search"
                                        onclick="product.showCellEditor();return false;" />
                            <p:menuitem value="Hide Menu" icon="ui-icon-close"
                                        onclick="cMenu.hide()" />
                        </p:contextMenu>
                        <p:contextMenu rendered="#{carr.model eq 'WAITING'}" for="test1" widgetVar="cMenu3">

                            <p:menuitem value="Hide Menu" icon="ui-icon-close"
                                        onclick="cMenu3.hide()" />
                        </p:contextMenu>
                    </p:panel>
                </p:column>  
Run Code Online (Sandbox Code Playgroud)

  • 对我而言,声誉并不值得,我已经对它进行了测试,它对我来说很好,我只是想帮助其他人! (2认同)

Xtr*_*ica 2

可选的 for 属性定义 contextMenu 附加到哪个组件。当for未定义时,contextMenu附加到页面的意思,右键单击页面上的任意位置将显示菜单。

这就是Primefaces 文档contextMenu标签的描述。因此,按照您的方式,它附加到页面含义上。使用for属性,您将能够与 Primefaces 组件集成,但可能无法与特定的表列集成。

另外,Datatable文档表明您只能在对表进行选择时执行此操作,因为它似乎有特殊的方法来使其适应树节点

不过,我强烈建议您在询问之前先查看文档。