Primefaces 8.0页面AJAX请求报错,行展开功能无法使用问题求助
问题分析与解决方案
根因定位
报错的核心原因是你项目中配置的全局<p:ajaxStatus>组件绑定了不存在的JS回调函数:
- 组件的
onstart属性配置了调用ajaxWaitCursorOn(),onsuccess/onerror属性配置了调用ajaxWaitCursorOff(),但这两个函数没有被引入到页面中 - 页面初始化时仅注册回调不会执行,所以加载无异常;只要触发任何AJAX请求(行展开、筛选都属于AJAX请求)就会执行回调,触发未定义错误
- 你当前的DataTable、行展开相关代码本身没有逻辑问题,报错和功能逻辑无关
解决步骤
- 先找到全局AjaxStatus的配置,大概率放在你引用的公共模板
/template/maintemplate.xhtml中,配置格式类似:
<p:ajaxStatus onstart="ajaxWaitCursorOn()" onsuccess="ajaxWaitCursorOff()" onerror="ajaxWaitCursorOff()" />
- 二选一执行修复即可:
- 方案1:补全缺失的JS函数。在公共模板的
<h:head>标签内,或者项目引入的公共JS文件中添加如下代码(你已经确认jQuery正常加载,可直接使用):
function ajaxWaitCursorOn() { document.body.style.cursor = 'wait'; // 用jQuery也可以写为 $('body').css('cursor', 'wait'); } function ajaxWaitCursorOff() { document.body.style.cursor = 'default'; // 用jQuery也可以写为 $('body').css('cursor', 'default'); }
- 方案2:不需要AJAX加载光标效果的话,直接删除AjaxStatus组件上绑定的
onstart、onsuccess、onerror属性的函数调用即可。
额外优化建议
你当前在<h:form>内直接写#{searchResultsBean.init}触发初始化的写法不规范,建议改为以下两种方式之一:
- 给SearchResultsBean的init方法添加
@PostConstruct注解,Bean实例化后会自动执行初始化 - 在页面中添加事件标签触发:
<f:event type="preRenderView" listener="#{searchResultsBean.init}" />
内容的提问来源于stack exchange,提问作者Steve Zavocki
相关产品推荐
相关产品推荐

