我有一个带有属性 editable="true" 的 primefaces 数据表,因此我无法动态编辑行。我有两个字段:一个 inputText 和一个 selectOneMenu。我希望能够从页脚动态添加行。我在页脚中添加了空字段,当用户单击按钮时,我想将新行添加到具有正确值的数据表中。
这是我的代码:
<h:form>
...
<p:dataTable value="#{bean.myObjects}" id="myDatatable" editable="true" var="obj">
<f:facet name="header">
<h:outputText value="My Datatable" />
</f:facet>
<p:column headerText="My String value">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{obj.myString}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{obj.myString}"/>
</f:facet>
</p:cellEditor>
<f:facet name="footer">
<h:inputText value="#{bean.myNewObject.myString}" />
</f:facet>
</p:column>
<p:column headerText="My List Value">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{bean.myListValue ? 'yes' : 'no'}" />
</f:facet>
<f:facet name="input">
<h:selectOneMenu value="#{bean.myListValue}" >
<f:selectItem itemValue="true" itemLabel="yes" />
<f:selectItem itemValue="false" itemLabel="no" />
</h:selectOneMenu>
</f:facet>
</p:cellEditor>
<f:facet name="footer">
<h:selectOneMenu value="#{bean.myNewObject.myListValue}" >
<f:selectItem itemValue="true" itemLabel="yes" />
<f:selectItem itemValue="false" itemLabel="no" />
</h:selectOneMenu>
</f:facet>
</p:column>
<p:column>
<p:rowEditor />
<f:facet name="footer">
<h:commandButton actionListener="#{bean.addRow}">
<f:ajax execute="myDatatable" render="myDatatable" />
</h:commandButton>
</f:facet>
</p:column>
</p:dataTable>
...
</h:form>
在我的 bean 中,我只有 addRow 方法:
public void addRow() {
this.myObjects.add(this.myNewObject);
this.myNewObject = new MyObject();
}
和初始化:
@PostConstruct
public void init() {
this.myObjects = Controller.getAllMyObjects();
this.myNewObject = new MyObject();
}
我可以确定 bean 在 ViewScope 中。结果是添加了行,字符串值是正确的,但列表值始终为“否”,即使我在实例化对象后使用 bean 中的 this.myNewObject.setMyListValue(true) 将其设置为 true。
我知道这是渲染或执行属性的东西。如果我换行:
<f:ajax execute="myDatatable" render="myDatatable" />
至:
<p:ajax update="@form" />
列表值为 true,但未设置字符串值。
如何确保我的两个属性都已呈现,以及如何在不提交整个表单的情况下获得值?
谢谢