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
相关产品推荐
相关产品推荐

