0

我在使用 JSF 和 PrimeFaces 时遇到了一点问题。我有一个带有两个<p:selectonemenu>s 和两个<h:outputText>s 的表格。第一个的内容<p:selectonemenu>更新第二个,两个<h:outputText>s 用第二个更新<p:selectonemenu>。两个<p:selectonemenu>s 都依赖于我的支持 bean 上的值。<h:outputText>问题是当 FIRST<p:selectonemenu>更改它的值时,我无法清除s 。

我尝试使用<f:ajax>监听器来清除当前显示的实体的内容。

这是xhtml:

<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"/>

bailmentsController上的第一个监听器<p:selectonemenu>

public void clearView(BailmentFamilies bf) {
    if (bf != null) {
        current = new Bailments();
        current.setBailmentFamId(bf);
    }
}

在我的数据库中,每个 Bailment 都分配有一个 BailmentFamily,这就是我使用两步过滤器的原因。第一个<p:selectonemenu>列出所有可用的 BailmentFamily,第二个<p:selectonemenu>显示选定 BailmentFamily 的所有可用 Bailments。s 显示所选 Bailment的<h:outputText>信息,这就是为什么我需要在 BailmentFamily 更改时清除它们。

任何人都可以提出另一种行动方案吗?因为这并没有被证明是有效的。非常感谢。

4

3 回答 3

2

我刚刚解决了这个问题。原来我必须清除我实体中的所有值。可能很傻,但其他开发人员可能会遇到这样的问题:

我编辑了我的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);
}

希望这对任何人都有帮助。

于 2013-03-15T18:52:52.777 回答
2

当它们没有在第一个选择菜单的标记属性中列出时,为什么你期望<h:outputText>它们被更新?你需要render<f:ajax/>

  1. 为两个s分配id属性<h:outputText>

    <h:outputText id="text1" value="#{bundle.BailmentFamiliesLabel_bailmentFamCode}"/>
    <h:outputText id="text2" value="#{bundle.BailmentsLabel_bailmentCode}"/>
    
  2. 参考id中的<f:ajax/>

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

到目前为止,它会起作用。出于最佳/最佳实践的观点

  1. 改为使用<p:ajax/>。它应该执行得更快(因为底层的 jquery)并让您可以访问其他功能

    <p:ajax update="description, text1, text2, price, bailmentCode" listener="${bailmentsController.clearView(famid)}"/>
    
  2. 使用 EL 表示法 ( #) 而不是 JSTL( $)

    <p:ajax update="description, text1, text2, price, bailmentCode" listener="#{bailmentsController.clearView(famid)}"/>
    
于 2013-03-15T18:37:43.220 回答
0

你也可以使用,

<input type="button" value="Reset Form" onclick="this.form.reset()" />

这将重置表单值,但不会重置支持 bean,因此如果您使用表单外的 actionListener/action 中的表单数据,这种方法将不安全。

于 2013-03-15T19:23:27.570 回答