1

私は自分の問題についてSOや他の場所を読みました。

私がやっていることは完全に間違っていることを理解しています。私の問題は、それを正しく行う方法がわからないことです。誰かが私を助けてくれれば幸いです。

現在、私が持っているものは次のようになります。

<ul class="unstyled">   
    <ui:repeat value="#{paymentDetailsBean.products}" var="product" varStatus="status">
        <li>
            <div>
                <h:selectBooleanCheckbox value="#{product.initiallySelected}">
                    <f:ajax render="paymentDetailsForm:totalPriceText" listener="#{paymentDetailsBean.updateTotalPrice}"></f:ajax>
                </h:selectBooleanCheckbox>
            </div>
        </li>
    </ui:repeat>
</ul>

product.initiallySelectedユーザーが製品をチェック/チェック解除したときに更新するブール値です。

これを再レンダリングするために ajax タグも使用しています。

<h:outputText id="totalPriceText"><b>#{passengerDetailsBean.formatCurrency(paymentDetailsBean.totalPrice.toString())}</b></h:outputText>

商品の選択・選択解除で値上がり・値下がりするので、基本的には合計金額を更新しないで欲しいです。また、バックエンドでこの関数を呼び出すために ajax タグを使用しています (これが問題の原因であることは明らかです)。

public void updateTotalPrice(AjaxBehaviorEvent event)
{
    this.totalPrice = 0.0f;

    for (Product product : this.getProducts())
    {
        if (product.getInitiallySelected())
        {
            this.totalPrice += product.getCurrencyAmountGroup().getAmount();
        }
    }

    this.totalPrice += this.getTotalFaresAmount();
}

これはすべて機能しますが、非常に遅いです。それは、ajax タグを使用してビジネス ロジックを実行するべきではないためだとわかっています。正しいやり方がわかりません。誰でも私を助けてもらえますか?

4

1 に答える 1

1

特定の製品をチェック/チェック解除して合計値を増減したい場合、および環境が EL 2.2+ をサポートしていると仮定すると (スニペットから判断して本当のことです)、現在の金額を Bean プロパティとして保存し、増減することができます現在選択されている製品とチェックボックスの現在の値に応じて、次のようになります。

<ui:repeat value="#{paymentDetailsBean.products}" var="product">
    <li>
        <div>
            <h:selectBooleanCheckbox>
                <f:ajax render=":paymentDetailsForm:totalPriceText" 
                        listener="#{paymentDetailsBean.updateTotalPrice(product, component.value)}" />
            </h:selectBooleanCheckbox>
        </div>
    </li>
</ui:repeat>
<h:outputText value="#{paymentDetailsBean.totalPrice}" />

リスナーの場合:

public void updateTotalPrice(Product product, Boolean direction) {
    totalPrice += product.getCurrencyAmountGroup().getAmount() *
                       (direction ? 1 : -1);
}
于 2013-10-22T14:52:45.607 に答える