当我在SelectOneMenu中使用空SelectItem为我的用户在SelectOneMenu中提供空选时,它可以正常工作。正如在这个帖子中所建议的那样:Best way to add a "nothing selected" option to a selectOneMenu in JSF
但是当我在SelectOneMenu中使用一个空的SelectItem时,它存在于一个数据表中,当我在数据表中使用CellEditing时,它不会保留正确的SelectItem。
这是我的代码:
<p:dataTable id="fooTable"
value="#{fooSessionBean.foos}"
var="foo"
rows="15"
style="width: 100%"
paginator="true"
paginatorPosition="bottom"
paginatorAlwaysVisible="false"
editable="true" >
...
<p:column sortBy="#{empty foo.bar ? '' : foo.bar.name}">
<p:cellEditor>
<f:facet name="output"> <h:outputText value="#{foo.bar.name}" title="#{foo.bar.name}" rendered="#{!empty foo.bar}" /></f:facet>
<f:facet name="input">
<p:selectOneMenu id="bars" value="#{foo.bar}" converter="foobarConverter" style="width:100%">
<f:selectItem itemLabel="No bar" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{fooSessionBean.foos}" var="bars" itemLabel="#{bars.name}" itemValue="#{bars}" />
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
...
<p:column style="width:10%">
<p:rowEditor />
<p:commandButton action="#{fooSessionBean.delete(foo.id)}" icon="ui-icon-trash" title="remove" ajax="false"/>
</p:column>
Foo对象有一个字段Bar。当您尝试使用RowEditing编辑字段时,上面的代码会生成一个Bar项列表。 Foo对象也可能没有Bar字段。因此空的SelectItem。
这一切都有效,只是错误的Bar项目在Foo对象中持久存在。我选择的Bar对象之前的Bar对象是持久的。例如:
SelectOneMenu包含:
当您选择bar2时,bar1将保留在te foo对象中。
是否有可能在这样的地方使用不同的组件或者我忽略了别的东西?因为我发现很少有人试图这样做,并且遇到了同样的问题。