我有三种用户选择:两种设备选择和一种选择,说我不想要设备。要选择我使用p:commandLink
的两台设备。说我不想要使用h:selectOneRadio
的设备。
如果用户不想购买设备,用户可以选择选项按钮'我不希望有'。因此,在任何时候,只能在其中三个按钮中选择一个按钮。
如果我按h:selectOneRadio
按钮,则其他两个按钮(p:commandLink
)会正确更新以选择'。但是,如果我选择了一个设备(p:commandLink
),那么h:selectOneRadio
按钮不会取消选择,即使它的bean值更新为false。
JSF页面
<h:panelGroup id="pwpPanel">
<div class="row">
<ui:repeat value="#{reconBean.EQList}" var="equipment">
<div class="col-md-4">
<div class="btn-fibre-tab text-center">
<ui:fragment rendered="#{reconBean.pwpSelectedEquipmentID != equipment.id }">
<p:commandLink id="selectpwp" process="@form" update=":mainForm:pwpPanel"
styleClass="select_button" action="#{reconBean.updatePWPItem(equipment.id)}"
immediate="true">
Select
<f:ajax render=":mainForm:pwpPanel" />
</p:commandLink>
</ui:fragment>
<ui:fragment rendered="#{reconBean.pwpSelectedEquipmentID eq equipment.id }">
<p:commandLink id="selectedpwp" process="@form" update=":mainForm:pwpPanel"
styleClass="selected_button" action="#{reconBean.updatePWPItem(equipment.id)}"
immediate="true">
Selected
<f:ajax render=":mainForm:pwpPanel" />
</p:commandLink>
</ui:fragment>
</div>
</div>
</ui:repeat>
</div>
<div class="row">
<div class="col-sm-12 ">
<h:selectOneRadio value="#{reconBean.notPurchaseWithPurchase}" id="radioDoNotWant"
name="pwpEquipment">
<f:selectItem itemLabel="I do not wish to have" itemValue="true" />
<f:ajax event="click" execute="@this" listener="#{reconBean.resetPWPSelection}"
render="pwpPanel" />
</h:selectOneRadio>
</div>
</div>
</h:panelGroup>
Bean值
public void updatePWPItem(String itemID) {
pwpSelectedEquipmentID = itemID;
notPurchaseWithPurchase = false;
}
public void resetPWPSelection(AjaxBehaviorEvent event) {
pwpSelectedEquipmentID = null;
}
答案 0 :(得分:0)
问题是在 CommandLinks 上设置为 true 的立即属性。它基本上是要理解The Lifecycle of a JavaServer Faces Application。立即属性的影响因其所应用的组件类型而异。如good article中所述:
在标准JSF生命周期中,Command组件的action属性在Invoke Application阶段进行评估
...如果您在其上设置immediate="true"
。
老实说,我并不知道为什么这会阻止你的无线电选项被取消选中(我仍在学习JSF生命周期的所有方面),但我认为这是因为它在组件树中保持不变并被渲染因为即使模型是通过你的行动更新的(如果有人可能对此发表评论,我会相应更新)。
您的问题的解决方案是从 CommandLinks 中删除立即属性或将其设置为 false
一些评论:
PrimeFaces CommandLinks 具有内置的AJAX功能,默认情况下已启用。无需附加额外的<f:ajax />
。仅当您要禁用AJAX时,您必须将其 ajax 属性设置为 false 。 Ajax 的 render 属性符合 CommandLink 的 update 属性。
您在非设计用于的上下文中使用 SelectOneRadio 。正如JSFToolbox所述:
此组件适用于您希望将用户选项的互斥列表显示为一组单选按钮的情况。
考虑使用其他更适合的组件,例如 CommandLink 或 CommandButton 。