Я читал о своей проблеме в 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. Я не знаю, как это правильно делать. Может ли кто-нибудь мне помочь?

1
Skytiger 22 Окт 2013 в 12:25
Ваше действие ajax будет зацикливать все продукты, даже если вы просто проверяете / снимаете отметки на одном продукте, поэтому оно становится медленным. Вы можете изменить метод updateTotalPrice, чтобы рассчитывать только на выбранный продукт, а не на все продукты.
 – 
ggDeGreat
22 Окт 2013 в 13:05
Не могли бы вы уточнить, пожалуйста? Я не совсем понимаю.
 – 
Skytiger
22 Окт 2013 в 13:26

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);
}
1
skuntsel 22 Окт 2013 в 18:52
У меня сейчас нет доступа к моей работе, но я попробую это сделать утром и сообщу вам результат. Спасибо!
 – 
Skytiger
22 Окт 2013 в 19:18