You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSF日历组件Ajax事件中无法获取f:attribute属性值的解决方法

问题原因与解决方案

问题根源

你把<f:attribute>放在了<p:ajax>标签内部,但JSF中,<p:ajax>作为子组件,其携带的f:attribute在请求阶段(触发ajax回调时)无法被正确传递到后台SelectEvent对应的组件属性中——因为ajax事件触发时,event.getComponent()获取到的是<p:calendar>组件,而非<p:ajax>组件,自然读不到ajax标签里的属性。

修复方案(推荐)

将<f:attribute>从<p:ajax>内部移到<p:calendar>标签内部,作为它的直接子元素:

<p:calendar class="fechaCalendar-#{producto.value.codigo}-0" pattern="dd/MM/yyyy" mindate="#{pedidoInicialesMB.minDate}" maxdate="#{pedidoInicialesMB.maxDate}" value="#{pedidoInicialesMB.pedido.fecha}">
    <f:attribute name="codigo" value="#{producto.value.codigo}" />
    <f:attribute name="fechaEntrega" value="#{fechaEntrega}" />
    <p:ajax event="dateSelect" listener="#{pedidoInicialesMB.actualizarFecha}" execute="@this" render="@none" />
</p:calendar>

后台代码无需修改,保持原有获取方式即可:

public void actualizarFecha(SelectEvent event) {
    Date nuevaFecha = (Date) event.getObject();
    
    String codigo = (String) event.getComponent().getAttributes().get("codigo");
    
    String fechaEntrega = (String) event.getComponent().getAttributes().get("fechaEntrega");
}

备选方案(不推荐)

如果一定要在<p:ajax>上绑定属性,可以通过event.getSource()获取<p:ajax>组件后读取属性,代码如下:

public void actualizarFecha(SelectEvent event) {
    Date nuevaFecha = (Date) event.getObject();
    // 获取触发事件的ajax组件
    AjaxBehavior ajax = (AjaxBehavior) event.getSource();
    String codigo = (String) ajax.getAttributes().get("codigo");
    String fechaEntrega = (String) ajax.getAttributes().get("fechaEntrega");
}

此方案逻辑不如第一种清晰,仅作为特殊场景下的备选。

内容的提问来源于stack exchange,提问作者NARTONIC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:20:05