2013-03-01 61 views
1

JSF-2.0,钻嘴鱼科2.1.19,PrimeFaces 3.4.1号码:dataTable中livescroll覆盖js函数

如从我的分组中可以看出。我正在使用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,并假设它有且只有具有由上述功能修改CSS p:inputText

问题发生p:dataTable有很多的行。假设用户向下滚动,表格的live scroll事件被触发(ajax请求),并且该表格加载更多行,但它会使用常规CSS加载p:inputText组件。函数不能将css应用到最近加载的行中。

所以有需要赶上liveScroll事件或担保JS功能在p:dataTable

回答

2

有每个更新工作是没有内置的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函数来获得客户端ID,例如#{p:component('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()"); 
    } 
} 

请注意,这不是记录的行为,可以在未来的版本中改变(但我没有想到这一点)。我还创建了an issue用于添加此功能,也许它很快就会添加。

+0

非常感谢,我要跟踪这个问题。再次感谢。 – 2013-03-01 20:06:46

+0

我正在测试这个。它似乎起初运行良好,但是当浏览其他页面并返回到此相关页面时,如果onPageLoad方法中的条件始终具有false条件,因此在冲浪其他页面后再次执行applyMyCSS() – 2013-03-01 20:51:24

+0

尝试调试'onPageLoad'方法,并查看参数映射中'datatableId'和参数的值。也许你只是没有在方法参数中分配正确的ID。 – partlov 2013-03-01 20:53:38