0

JSF と PrimeFaces の使用に少し問題があります。<p:selectonemenu>2 つの と 2つの を持つフォームがあり<h:outputText>ます。最初の内容が<p:selectonemenu>2 番目を更新し、2 つ<h:outputText>の が 2 番目の で更新され<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"/>

そして<p:selectonemenu>bailmentsController の最初のリスナー:

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

私のデータベースでは、各 Bailment に BailmentFamily が割り当てられているため、2 段階のフィルターを使用しています。1 つ目<p:selectonemenu>は利用可能なすべての BailmentFamilies を一覧表示し、2 つ目<p:selectonemenu>は選択した BailmentFamily で利用可能なすべての Bailments を表示します。s には、選択した Bailmentの<h:outputText>情報が表示されるため、BailmentFamily が変更されたときにそれらをクリアする必要があります。

誰かが別の行動方針を提案できますか? これは生産的であることが証明されていないためです。どうもありがとうございました。

4

3 に答える 3

2

最初の選択メニューのタグの属性にリストされていないのに、なぜ<h:outputText>ajax が更新されることを期待しているのですか? 必要があるrender<f:ajax/>

  1. 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. JSTL( )#の代わりにEL 表記 ( ) を使用する$

    <p:ajax update="description, text1, text2, price, bailmentCode" listener="#{bailmentsController.clearView(famid)}"/>
    
于 2013-03-15T18:37:43.220 に答える
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 に答える
0

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

これにより、フォームの値はリセットされますが、バッキング Bean はリセットされないため、フォーム外の actionListener/action からフォーム データを使用している場合、このアプローチは安全ではありません。

于 2013-03-15T19:23:27.570 に答える