JSF-2.0, Mojarra 2.1.19, PrimeFaces 3.4.1
从我上一个问题可以看出,我正在使用p:dataTable
来显示状态/评论模块。还有一个JS/jQuery函数,可以编辑datatable行的CSS;
jQuery(document).ready(function() {
var rowSize = '#{statusBean.size}';
for (var i = 0; i < rowSize; i++) {
var rowIndex = i;
var inputTextStr = 'dataTableForm' + ':dataTable:' + rowIndex + ':commentInput';
var inputText = $(document.getElementById(inputTextStr));
inputText.css({'box-shadow':'0 0 5px #EB2F28'});
}
});
p:dataTable
是具有liveScrolling=true
的常规p:inputText
,并假设它有一个且唯一具有上述函数修改的CSS的。
当p:dataTable
有很多行时出现问题。假设用户向下滚动,live scroll
表的事件被触发(ajax 请求(,并且表加载更多行,但它使用常规 CSS 加载p:inputText
组件。函数无法将 css 应用于新近加载的行。
因此,需要捕获该liveScroll
事件或JS函数在每次更新时工作p:dataTable
没有内置的 AJAX 事件可以处理这种情况,因此您必须自己执行此操作。我会尽量给你一些建议。
首先使用为此创建函数重新组织您的 JavaScript,并在加载页面中调用该函数:
function applyMyCSS() {
var rowSize = '#{statusBean.size}';
for (var i = 0; i < rowSize; i++) {
var rowIndex = i;
var inputTextStr = 'dataTableForm' + ':dataTable:' + rowIndex + ':commentInput';
var inputText = $(document.getElementById(inputTextStr));
inputText.css({'box-shadow':'0 0 5px #EB2F28'});
}
}
jQuery(document).ready(function() {
applyMyCSS();
});
现在,您应该以某种方式在后备 Bean 中处理此 AJAX 请求。我稍微调查了一下,发现当滚动发生时,发送了名称为 yourDataTableId_scrolling
的特定参数,例如 myForm:myTable_scrolling
,并且此参数的值为 true
。
将其添加到页面中的某个位置,最好在顶部的某个位置:
<f:metadata>
<f:event type="preRenderView" listener="#{myBean.onPageLoad('clientIdOfComponent')}"/>
</f:metadata>
岸上从页面中放置确切的客户端 ID。为此,您可以使用一些实用程序 PrimeFaces 函数,例如#{p:component('id')}
获取客户端 ID。此事件将在视图呈现之前和每个请求(AJAX 或非 AJAX(调用 onPageLoad()
函数。在该函数中,您将过滤liveScroll
事件并处理它:
public void onPageLoad(String datatableId) {
FacesContext fc = FacesContext.getCurrentInstance();
if (RequestContext.getCurrentInstance().isAjaxRequest() &&
"true".equals(fc.getExternalContext().getRequestParameterMap().get(datatableId + "_scrolling")) {
RequestContext.getCurrentInstance().execute("applyMyCSS()");
}
}
请注意,这不是记录的行为,可以在将来的版本中更改(但我不希望这样(。我还创建了一个添加此功能的问题,也许很快就会添加。