【问题标题】:Unable to ajax update component with p:commandLink click无法使用 p:commandLink 单击 ajax 更新组件
【发布时间】:2016-08-12 16:44:47
【问题描述】:

我为用户提供了三个选项:两个设备选择和一个选项说我不想要设备。要选择两个设备,我使用了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;
}

【问题讨论】:

  • 您至少可以 100% 确定地删除 p:commandLinks 中的 f:ajax。甚至可能是一个修复。
  • @Kukeltje 不,它也不是那样工作的。
  • 然后创建一个minimal reproducible example

标签: jsf jsf-2 primefaces


【解决方案1】:

问题CommandLinks 上的 immediate 属性设置为 true。本质上是了解The Lifecycle of a JavaServer Faces Application。 immediate 属性的影响不同,它应用在哪种组件上。如good article中所述:

在标准的 JSF 生命周期中,命令组件上的操作属性在调用应用程序阶段进行评估

...如果你在上面设置immediate="true"

说实话,我不知道为什么这会阻止您的单选选项被取消选中(我仍在学习 JSF 生命周期的所有方面),但我认为这是因为它在组件树中保持不变并被渲染即使模型是通过您的操作更新的(如果有人对此发表评论,我会相应地更新)。

解决方案是从 CommandLinks 中删除 immediate 属性或将其设置为 false .

一些备注:

  • PrimeFaces CommandLinks 内置了默认启用的 AJAX 功能。无需附加额外的&lt;f:ajax /&gt;。仅当您想禁用 AJAX 时,您必须将其 ajax 属性设置为 falseAjaxrender 属性符合 CommandLinkupdate 属性。

  • 您在不是为它设计的上下文中使用 SelectOneRadio。如JSFToolbox 所述:

    此组件专为您希望向用户显示互斥选项列表作为一组单选按钮的情况而设计。

    考虑使用另一个更合适的组件,例如 CommandLinkCommandButton

【讨论】:

  • 如果我删除了immediate="true",则单击按钮时根本不会调用该操作。
  • @imesh 从目前提供的代码中,我没有看到任何明显的可能导致此问题的内容。您是否收到任何错误消息和/或异常?查看this answer 并按照说明进行操作。
猜你喜欢
  • 2013-02-19
  • 1970-01-01
  • 2011-11-18
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多