Я читал о своей проблеме в 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 ответ
Если вы хотите увеличить / уменьшить общую стоимость, установив / сняв отметку с определенного продукта и предполагая, что ваша среда поддерживает 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);
}
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
updateTotalPrice
, чтобы рассчитывать только на выбранный продукт, а не на все продукты.