使用JSF和PrimeFaces时遇到了一些问题。我有一个包含两个<p:selectonemenu>
和两个<h:outputText>
的表单。第一个<p:selectonemenu>
的内容更新了第二个<h:outputText>
,并使用第二个<p:selectonemenu>
更新了<p:selectonemenu>
。 <h:outputText>
两个都依赖于我的支持bean上的值。问题是,当FIRST <p:selectonemenu>
更改其值时,我无法清除<f:ajax>
。
我尝试将<h:outputText value="#{bundle.BailmentFamiliesLabel_bailmentFamCode}"/>
<p:selectOneMenu id="bailmentFamilyCode" value="#{bailmentsController.selected.bailmentFamId}" required="false">
<f:selectItems value="#{bailmentFamiliesController.itemsAvailableSelectOne}" var="famid"/>
<f:ajax event="change" render="description price bailmentCode" listener="${bailmentsController.clearView(famid)}"/>
</p:selectOneMenu>
<h:outputText value="#{bundle.BailmentsLabel_bailmentCode}"/>
<p:selectOneMenu id="bailmentCode" value="#{bailmentsController.selected}" required="false">
<f:selectItems value="#{bailmentsController.itemsAvailableSelectOneByFamId}"/>
<f:ajax event="change" render="globalForm" listener="#{bailmentsController.view(bailmentsController.selected.bailmentCode,bailmentsController.selected.bailmentFamId)}" />
</p:selectOneMenu>
<h:outputText value="#{bundle.Label_description}"/>
<h:outputText value="#{bailmentsController.selected.description}" title="#{bundle.Title_description}" id="description"/>
<h:outputText value="#{bundle.BailmentsLabel_purchasePriceMsj}"/>
<h:outputText value="#{bailmentsController.selected.purchasePrice}" title="#{bundle.BailmentsTitle_purchasePrice}" id="price"/>
与监听器一起使用,以清除当前正在显示的实体的内容。
这是xhtml:
<p:selectonemenu>
bailmentsController上第一个public void clearView(BailmentFamilies bf) {
if (bf != null) {
current = new Bailments();
current.setBailmentFamId(bf);
}
}
的监听器:
<p:selectonemenu>
在我的数据库中,每个Bailment都被分配了一个BailmentFamment,这就是我使用两步过滤器的原因。第一个<p:selectonemenu>
列出所有可用的BailmentFamilies,第二个<h:outputText>
显示所选BailmentFamily的所有可用Bailments。 {{1}}显示所选Bailment的信息,这就是我需要在BailmentFamily更改时清除它们的原因。
有人可以提出另一种行动方案吗?因为这尚未证明有效。非常感谢你。
答案 0 :(得分:2)
如果<h:outputText>
未在第一个选择菜单的render
标记的<f:ajax/>
属性中列出,那么为什么期望id
更新为ajax?你需要
将<h:outputText>
属性分配给<h:outputText id="text1" value="#{bundle.BailmentFamiliesLabel_bailmentFamCode}"/>
<h:outputText id="text2" value="#{bundle.BailmentsLabel_bailmentCode}"/>
s
<f:ajax/>
参考<f:ajax event="change" render="description text1 text2 price bailmentCode" listener="${bailmentsController.clearView(famid)}"/>
<p:ajax/>
到目前为止它会起作用。为了达到最佳/最佳实践观点
请改用<p:ajax update="description, text1, text2, price, bailmentCode" listener="${bailmentsController.clearView(famid)}"/>
。它应该执行得更快(因为底层的jquery)并且允许您访问其他功能
#
使用EL表示法($
)代替JSTL(<p:ajax update="description, text1, text2, price, bailmentCode" listener="#{bailmentsController.clearView(famid)}"/>
)
{{1}}
答案 1 :(得分:2)
我刚刚解决了这个问题。事实证明,我必须清除实体中的所有值。愚蠢的perhaphs,但其他开发人员可能会坚持这个:
我编辑了clearView()
方法。这是有效的代码:
public void clearView(BailmentFamilies bf) {
if (bf != null) {
// Create a new empty object to recieve the new BailmentFamily
current = new Bailments();
current.setBailmentFamId(bf); // This property has to be kept.
// I pass it as parameter and reassigned it to the current entity.
// Otherwise, the <p:selectonemenu> will clear upon rendering because of the new call above.
}
// Set ALL displayed properties to null
current.setBailmentCode(null);
current.setDescription(null);
current.setPurchasePrice(null);
}
希望这有助于任何人。
答案 2 :(得分:0)
您也可以使用,
<input type="button" value="Reset Form" onclick="this.form.reset()" />
这将重置表单值,但不会重置支持bean,因此如果您使用表单外部的actionListener / action中的表单数据,则此方法将不安全。