2013-10-22 34 views
1

我已经阅读过所以和其他地方有关我的问题。使用JSF ajax调用不正确

我明白我在做什么是完全错误的。我的问题是,我不知道如何去做right,如果有人能帮助我,我会喜欢它。

目前我有什么看起来是这样的:

<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> 

基本上我想要的总价格OT进行更新,因为选择/取消选择一个产品将使它上升或下降。我还使用了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

你阿贾克斯行动将循环中的所有产品,即使你刚刚检查/取消选中单这取决于复选框的当前选择的产品和当前值增加/减少产品,这就是为什么它变得缓慢。你可以修改'updateTotalPrice'方法只计算所选产品而不是所有产品。 – ggDeGreat

+0

@ggDeGreat请您详细说明一下吗?我不太明白。 – Skytiger

回答

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); 
} 
+0

目前无法访问我的工作,但会在早上第一时间尝试一下,并让您知道结果。谢谢! – Skytiger