1

unitPrice、quantity、totalPriceの各フィールドを持つOrderLineエンティティがあります。そして、totalPrice値が計算されます:totalPrice = unitPrice*quantity。

totalPriceは永続化されたフィールドです。

ビューにoutputtextとしてtotalPriceを表示したい。

最初の代替案: <h:outputText id="total" value="#{unitPrice*quantity}"/> この代替案では、エンティティフィールドtotalPriceは更新されませんが、ビューには合計価格の正しい値が表示されます。

2番目の選択肢:<h:outputText id="total" value="#{orderLine.totalPrice }"/>

この代替方法では、データベースからフェッチされた値が表示されますが、この値は常にnullになります。

JSFのみを使用して、ページが表示されているときに値#{orderLine.totalPrice}を表示し、同じページでunitPriceまたはquantityが変更されたときに更新された値#{unitPrice * Quantity}を設定することは可能ですか?

感謝

4

2 に答える 2

2

もし私があなたなら、jQueryを使ったJavaScriptを使ってクライアント側でそれをやろうと思うでしょう。

しかし、本当にプレーンJavaとJSFでそれを実行したい場合、実行できることの1つは、フィールドの1つが更新されるたびに、または更新さtotalPriceれるたびにフィールドを更新することです。unitPricequantity

public void setUnitPrice(BigDecimal unitPrice) {
    this.unitPrice = unitPrice;
    this.updateTotalPrice();
}
public void setQuantity(BigDecimal quantity) {
    this.quantity = quantity;
    this.updateTotalPrice();
}
private void updateTotalPrice() {
    // update total price accordingly:
    if (unitPrice != null && quantity != null){
        this.totalPrice = this.unitPrice.multiply(this.quantity);
    }
}

このようにして、モデルを常に最新の状態にすることもできます。

次に、フォームコントロールとフォームコントロールのイベントonchangeで、次のように、ajaxを使用してコンポーネントを再レンダリングする必要があります。unitPricequantity

<h:panelGrid>
    <label>Unit Price</label>
    <h:inputText value="#{myBean.unitPrice}">
        <f:convertNumber type="currency" />
        <f:ajax render="totalPrice" />
    </h:inputText>
    <label>Quantity</label>
    <h:inputText value="#{myBean.quantity}">
        <f:convertNumber type="currency" />
        <f:ajax render="totalPrice" />
    </h:inputText>
    <h:outputText id="totalPrice" value="#{myBean.totalPrice}">
        <f:convertNumber type="currency" />
    </h:outputText>
</h:panelGrid>
于 2012-07-14T17:10:37.953 に答える
1

エンティティを直接使用する代わりに、ラッパーを使用して、ラップされたgetTotalPriceメソッドにロジックを配置する必要があります。このようにして、ロジックとプレゼンテーションの分離が向上します。この場合、getTotalPriceに丸めロジックを追加できます(ほとんどの場合、IEEEフローティング数学はお金に関連する数学には適合しません...)

于 2012-07-14T13:32:24.803 に答える