清除JSF上的输出字段

时间:2013-03-15 18:07:31

标签: java jsf primefaces

使用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更改时清除它们的原因。

有人可以提出另一种行动方案吗?因为这尚未证明有效。非常感谢你。

3 个答案:

答案 0 :(得分:2)

如果<h:outputText>未在第一个选择菜单的render标记的<f:ajax/>属性中列出,那么为什么期望id更新为ajax?你需要

  1. <h:outputText>属性分配给<h:outputText id="text1" value="#{bundle.BailmentFamiliesLabel_bailmentFamCode}"/> <h:outputText id="text2" value="#{bundle.BailmentsLabel_bailmentCode}"/> s

    <f:ajax/>
  2. 参考<f:ajax event="change" render="description text1 text2 price bailmentCode" listener="${bailmentsController.clearView(famid)}"/>

    中的ID
    <p:ajax/>
  3. 到目前为止它会起作用。为了达到最佳/最佳实践观点

    1. 请改用<p:ajax update="description, text1, text2, price, bailmentCode" listener="${bailmentsController.clearView(famid)}"/> 。它应该执行得更快(因为底层的jquery)并且允许您访问其他功能

      #
    2. 使用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中的表单数据,则此方法将不安全。