2013-08-20 48 views
8

我想让用户只有在满足某些条件时才能编辑数据表中的单元格。PrimeFaces数据表中的条件单元格编辑

起初我试图<choose>来实现这一目标:

<p:dataTable var="item" value="${bean.items}" editable="true" editMode="cell"> 
    <p:column headerText="column A"> 
     <c:choose> 
      <c:when test="${item.isEditable}"> 
       <p:cellEditor id="title"> 
        <f:facet name="output"> 
         <h:outputText value="#{item.title}"/> 
        </f:facet> 
        <f:facet name="input"> 
         <p:inputText value="#{item.title}"/> 
        </f:facet> 
       </p:cellEditor> 
      </c:when> 
      <c:otherwise> 
       <h:outputText value="#{item.title}"/> 
      </c:otherwise> 
     </c:choose> 
    </p:column> 
... 

,但它不工作。另一种方法是使用rendered属性:

<p:column headerText="column A"> 
    <p:cellEditor rendered="${item.isEditable}"> 
     <f:facet name="output"> 
      <h:outputText value="#{item.title}"/> 
     </f:facet> 
     <f:facet name="input"> 
      <p:inputText value="#{item.title}"/> 
     </f:facet> 
    </p:cellEditor> 
    <h:outputText value="#{item.title}" rendered="#{!item.isEditable}"/> 
</p:column> 

工作正常 - 用户能够编辑只允许细胞。

但即使单元格不可编辑,它仍然具有ui-cell-editing类,并且看起来像用户的可编辑单元格。

将条件应用于单元格编辑的正确方法是什么?

谢谢!

回答

6

为了正确学习JSTL失败的教训,失败了,原因如下:JSTL in JSF2 Facelets... makes sense?简而言之:#{item}在JSTL运行时不可用。

说回具体问题:被插入该样式类由于组合editMode="cell"和在<p:column>物理存在<p:cellEditor>组分。 PrimeFaces数据呈现器根本不考虑是否呈现<p:cellEditor>。它只是直接插入ui-editable-column样式类,然后通过JS/jQuery触发ui-cell-editing样式。您正在寻找解决方案的正确方向,JSTL可以有条件地在JSF组件树中添加/删除JSF组件,但不幸的是,它不适用于此构造。

最好的办法是发布an issue report给PrimeFaces家伙,您不仅要考虑<p:cellEditor>组件的实际存在,还要考虑其isRendered()的结果。考虑PrimeFaces 3.5版,这将是在line 796 of DataTableRenderer class最初看起来是这样的(新行推出了可读性):

String styleClass = selectionEnabled 
    ? DataTable.SELECTION_COLUMN_CLASS 
    : (column.getCellEditor() != null) 
     ? DataTable.EDITABLE_COLUMN_CLASS 
     : null; 

并应作如下修改:

String styleClass = selectionEnabled 
    ? DataTable.SELECTION_COLUMN_CLASS 
    : (column.getCellEditor() != null && column.getCellEditor().isRendered()) 
     ? DataTable.EDITABLE_COLUMN_CLASS 
     : null; 

如果您不能等待,在此期间,您可以自行创建自定义渲染器。

package com.example; 

import org.primefaces.component.datatable.DataTableRenderer; 

public class MyDataTableRenderer extends DataTableRenderer { 

    @Override 
    protected void encodeCell(FacesContext context, DataTable table, UIColumn column, String clientId, boolean selected) throws IOException { 
     // Copypaste here the original encodeCell() source code and make modifications where necessary. 
    } 

} 

然后让它运行,如faces-config.xml如下注册它:

<render-kit> 
    <renderer> 
     <description>Overrides the PrimeFaces table renderer with customized cell renderer.</description> 
     <component-family>org.primefaces.component</component-family> 
     <renderer-type>org.primefaces.component.DataTableRenderer</renderer-type> 
     <renderer-class>com.example.MyDataTableRenderer</renderer-class> 
    </renderer> 
</render-kit> 
+0

谢谢@BalusC我一定会尝试使用自定义渲染并张贴在这里的结果。非常感谢您的全面回答! – Meta

+0

不客气。 – BalusC

+0

非常感谢您为此,我将开展拉取请求以复制此行为。 –

相关问题