我想仅在满足某些条件的情况下允许用户编辑数据表中的单元格。
最初,我尝试<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
类,并且对于用户而言就像可编辑单元格。
将条件应用于单元格编辑的正确方法是什么?
谢谢!
要正确学习JSTL失败的课程,它失败的原因如下所述:JSF2 Facelets中的JSTL ...有意义吗?简而言之:#{item}
JSTL运行时不可用。
回到一个具体的问题:由于样式的组合editMode="cell"
和组件中的物理存在,因此插入了样式类。PrimeFaces数据表渲染器根本不考虑是否渲染了。它只是直接插入样式类,然后通过JS / jQuery触发样式。您正在为解决方案寻找正确的方向,JSTL可以有条件地在JSF组件树中物理地添加/删除JSF组件,但是不幸的是,它无法在此构造中使用。<p:cellEditor>
<p:column>
<p:cellEditor>
ui-editable-column
ui-cell-editing
最好的选择是将问题报告发布给PrimeFaces员工,据此,您不仅要考虑<p:cellEditor>
组件的物理存在,而且要考虑其isRendered()
结果。考虑到PrimeFaces 3.5版,它将位于该类的第796行中,DataTableRenderer
其最初看起来像这样(为便于阅读而引入了换行符):
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>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句