我在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标签来做业务逻辑。我不知道这样做的正确方法。有人可以帮帮我吗?
答案 0 :(得分: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);
}