我在JSF应用程序中遇到了以下问题:我有一个包含多个表单的页面,每个表单都由两个commandButton和一个ajax标记组成。我想在用户点击第二个按钮时执行addArticleToCart方法,但我也想在backingbean中设置一个属性(qty),以使这个值可用于我的addArticle方法。问题是,当我不使用ajax标记时,qty值被设置为最后一个inputtext值(而不是单击的值)。当我使用ajax时,第一次点击页面是有效的,但随后:-如果我点击另一个表单按钮,第一次点击不起作用(第二次、第三次…起作用)。。。-如果我点击同一个表单,它就会工作。。。
所以我想问,在没有ajax的情况下,有可能做到我需要的吗?因为这让我抓狂,当我从ajax标签中删除render属性时,方法被调用,但(购物车的)价格没有更新,我必须执行刷新。。。提前感谢的帮助
<composite:implementation>
<li class="span2 thumbnail">
<h:form id="cocktailThumbnail">
<div class="filling-thumb">
<ui:param name="img_path" value="img:#{cc.attrs.item.photoURIName}.#{cc.attrs.item.photoURIExt}" />
<img src="#{resource[img_path]}" alt="Cocktail#{cc.attrs.item.name}"/>
</div>
<div class="caption">
<h3 class="title-cocktail">#{cc.attrs.item.name}</h3>
<div class="text-center">
<div class="btn-group" >
<h:commandButton image="#{resource['img:info_small.png']}"
alt="Détails du cocktail"
title="#{dataManagedBean.getCocktail(cc.attrs.item.ID).getRecipe()}"
styleClass="btn"
action="#{dataManagedBean.displayCocktailDetails(cc.attrs.item)}">
</h:commandButton>
</div>
<br/><br/>
<div class="input-prepend">
<h:commandButton image="#{resource['img:cart_small.png']}"
alt="Ajouter le cocktail au panier"
title="Ajouter le cocktail au panier"
styleClass="btn"
actionListener="#{dataManagedBean.addArticleToCart(cc.attrs.item)}">
<!--Utilisation de ajax sinon lors du clic tous les input sont envoyé et donc qty = qty du dernier input
Avec ajax on envoie que ce form et it works -->
<f:ajax execute="@this" render="@all" />
</h:commandButton>
<h:inputText alt="Nombre de cocktails à ajouter au panier"
maxlength="3"
value="#{dataManagedBean.qty}"
styleClass="input-mini"
title="Nombre de cocktails à ajouter au panier" />
</div>
</div>
</div>
</h:form>
</li>
</composite:implementation
编辑:当我用render=":menubar"更改渲染时,一切都很好,它可以做我想要的。。。你有解释吗?
您似乎面临以下BalusC描述的问题:
<a4j:命令按钮>操作仅在第二次点击时调用
简单地说,使用render="@all"
会导致h:form
重新渲染,而使用render=":menubar"
则不会。当h:form
被重新渲染时,重新渲染后的第一个请求失败。