【问题标题】:p:commandButton action and f:setpropertyactionlistener not invoked in p:columngroupp:commandButton 操作和 f:setpropertyactionlistener 未在 p:columngroup 中调用
【发布时间】:2013-07-24 04:33:41
【问题描述】:

我需要将子组件放在 primefaces 子表页脚 (p:columngroup type="footer") 中,但标准子表渲染器不提供这样的机会。所以我重写了 org.primefaces.component.SubTableRenderer 来添加子渲染:

public class CustomSubTableRenderer extends SubTableRenderer{
@Override
protected void encodeColumnFooter(FacesContext context, SubTable table, Column column) throws IOException {
    ResponseWriter writer = context.getResponseWriter();

    String style = column.getStyle();
    String styleClass = column.getStyleClass();
    styleClass = styleClass == null ? DataTable.COLUMN_FOOTER_CLASS : DataTable.COLUMN_FOOTER_CLASS + " " + styleClass;

    writer.startElement("td", null);
    writer.writeAttribute("class", styleClass, null);
    if(column.getRowspan() != 1) writer.writeAttribute("rowspan", column.getRowspan(), null);
    if(column.getColspan() != 1) writer.writeAttribute("colspan", column.getColspan(), null);
    if(style != null) writer.writeAttribute("style", style, null);

    //encode children
    for(UIComponent footerColumnChild : column.getChildren()) {
        if(footerColumnChild.isRendered()) {
            footerColumnChild.encodeAll(context);
        }
    }

   UIComponent facet = column.getFacet("footer");
    String text = column.getFooterText();
    if(facet != null) {
        facet.encodeAll(context);
    } else if(text != null) {
        writer.write(text);
    }

    writer.endElement("td");
}

}

当我将一些子组件放在 p:column 组中时:

<p:dataTable>
            <p:subTable>
                <p:column>..</p:column>
                <p:columnGroup type="footer"> <p:row> <p:column colspan="3">
                    <p:commandButton id="button" 
                                     action="#{myBean.someAction}"
                                     oncomplete="jQuery('#select').modal('show');return false;"
                                     value="#{val.add}" alt="#{val.add}"
                                     title="#{val.add}"> </p:commandButton>
                    <f:setPropertyActionListener value="#{otherBean.id}"
                                                 target="#{anotherBean.selectedBackId}" /></p:column> </p:row>
                </p:columnGroup> </p:subTable>
        </p:dataTable>

按钮被渲染并且 onClick 事件调用正常,但是按钮的动作和 f:setPropertyActionListener 都没有调用。如何让它们发挥作用?

如果我将 p:columnGroup type="footer" 构造更改为 p:column 标记,而不是按钮操作和 f:setPropertyActionListener 都可以正常工作

【问题讨论】:

    标签: java jsf primefaces datatable custom-renderer


    【解决方案1】:

    PrimeFaces 有一个错误,如果 commandButton 或 commandLink 位于标头中,它不会触发动作侦听器(source - 请参阅第二个缺陷)。我有预感你在页脚中遇到了同样的问题。

    此问题已在最近的版本中得到修复,但尚未向公众提供。如果您想使用 PrimeFaces 按钮(而不是标准的 HTML 按钮),则必须购买 PrimeFaces Elite 订阅或从头开始编译源代码。

    【讨论】:

      【解决方案2】:

      我认为你可以像这样将 setPropertyActionListener 放在 commandButton 中:

      <p:commandButton ...> 
       <f:setPropertyActionListener value="#{otherBean.id}" target="#{anotherBean.selectedBackId}"/>
      </p:commandButton>
      

      【讨论】:

        【解决方案3】:
         <p:commandButton 
                        action="#{customerBean.remove}" 
                        value="Delte" 
                        title="Delete"
                        update="customer_table">
                            <f:setPropertyActionListener 
                            target="#{customerBean.customer}"
                            value="#{cursomer}" />
                            <p:confirm 
                                header="Confirmation" 
                                message="Are you sure?" 
                                icon="ui-icon-alert" />
                </p:commandButton>
        
                 <p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
                    <p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
                    <p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
                </p:confirmDialog>
        

        【讨论】:

        • 欢迎来到 Stack Overflow。虽然此代码可能会回答问题,但提供有关此代码回答问题的原因和/或方式的附加上下文会提高其长期价值。How to Answer
        猜你喜欢
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 2013-07-28
        • 2017-11-23
        • 2013-09-28
        • 2014-09-17
        • 2016-06-17
        • 2011-10-09
        相关资源
        最近更新 更多