【问题标题】:Using JSF ajax call incorrectly错误地使用 JSF ajax 调用
【发布时间】:2013-10-31 00:26:23
【问题描述】:

我已经在 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 标签来做业务逻辑。我不知道正确的做法。谁能帮帮我?

【问题讨论】:

  • 您的 ajax 操作将循环所有产品,即使您只是检查/取消选中单个产品,这就是它变慢的原因。您可以修改updateTotalPrice 方法仅依靠选定的产品而不是所有产品。
  • @ggDeGreat 你能详细说明一下吗?我真的不明白。

标签: java javascript jquery ajax jsf


【解决方案1】:

如果您想通过选中/取消选中特定产品来增加/减少总价值,并假设您的环境支持 EL 2.2+(从您的 sn-p 判断是真的),您可以将当前数量存储为 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);
}

【讨论】:

  • 目前无法访问我的工作,但会在早上第一件事尝试此操作并告知您结果。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2014-11-22
相关资源
最近更新 更多