我需要创建一个表格,其中标题列表来自模型。表内容也存储在模型中,p:dataTable循环存储在数据上,以根据列名显示内容。
问题是我需要让一些特定的单元格可编辑。对于输出数据没有问题,因为我使用模型方法,它接受实体和列名称,并根据列名称从实体返回正确的信息。问题在于可编辑单元格的输入,我不知道如何在实体中设置。
<p:dataTable id="processTable" var="entity" value="#{home.process.headerEntities}" tableStyle="width:auto" draggableColumns="true" editable="true" editMode="cell">
<p:columns value="#{home.process.columns}" var="columnHead" >
<f:facet name="header">
<h:outputText value="#{columnHead}"/>
</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{home.process.getData(entity, columnHead)}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{home.process.getData(entity, columnHead)}" rendered="#{home.process.isEditable(columnHead)}" style="width:100%" />
</f:facet>
</p:cellEditor>
</p:columns>
</p:dataTable>
根据BEST ANSWER进行更改后
<p:dataTable id="processTable" var="entity" value="#{home.process.headerEntities}" tableStyle="width:auto" draggableColumns="true" editable="true" editMode="cell">
<p:columns value="#{home.process.columns}" var="columnHead" >
<f:facet name="header">
<h:outputText value="#{columnHead}"/>
</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{entity[home.process.columnPropertyMap[columnHead]]}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{entity[home.process.columnPropertyMap[columnHead]]}" rendered="#{home.process.isEditable(columnHead)}" style="width:100%" />
</f:facet>
</p:cellEditor>
</p:columns>
</p:dataTable>
答案 0 :(得分:3)
输入组件的值必须绑定到可写值表达式。你在那里有一个直接的getter方法调用,因此基本上是只读的。这确实无法奏效。您需要指定#{entity}
的属性名称。您可以使用括号表示法将属性名称指定为变量,如#{entity[propertyName]}
。
所以,基本上:
<p:dataTable value="#{bean.entities}" var="entity" editable="true" editMode="cell">
<p:columns value="#{bean.propertyNames}" var="propertyNames">
<p:cellEditor>
<f:facet name="output">
#{entity[propertyName]}
</f:facet>
<f:facet name="input">
<p:inputText value="#{entity[propertyName]}" />
</f:facet>
</p:cellEditor>
</p:columns>
</p:dataTable>
关于列标题,而是将其重构为Map<String, String>
,其中键是propertyName
,值是标题。
<f:facet name="header">
#{bean.columnHeaders[propertyName]}
</f:facet name="header">
或者更好的是,使用普通的i18n资源包,其中propertyName
代表捆绑密钥的一部分。
<f:facet name="header">
#{bundle['table.column.header.' += propertyName]}
</f:facet name="header">
关于可编辑检查,而是将propertyName
和editable
包装在另一个bean中(如果您不想使用i18n包,也可以columnHeader
),例如Field
,然后使用如下:
<p:columns value="#{bean.fields}" var="field">
<p:cellEditor>
<f:facet name="output">
#{entity[field.propertyName]}
</f:facet>
<f:facet name="input">
<p:inputText value="#{entity[field.propertyName]}" rendered="#{entity[field.editable]}" />
</f:facet>
</p:cellEditor>
</p:columns>
总而言之,它只是归结为准备和提供视图所期望的正确模型。这样就不需要getData()
。