我有一个dataTable和一个带有几个输入的过滤器。在过滤器中,我有一个ajax命令按钮。ajax从bean中触发一个方法,该方法在数据库中搜索符合过滤器标准的记录,并呈现dataTable。问题是ajax调用并不总是工作。我知道这很奇怪,对我来说也是,但这是真的。并不是我的意思是,让我5请求(点击5次commandLink和ajax的工作方式,数据变化,方法从bean解雇)和比6日时间它不会工作,没有发生(没有从客户端请求,方法从bean不叫),再次点击,仍然什么也没有发生,让说当点击第3次它的作品,但不是通过ajax,但正常的提交和重新加载整个页面。我给出的数字并不总是相同的,有时我发出的第一个请求不工作,有时我工作了很多次而没有这个错误。一些代码:
- 表:
<h:dataTable id="usersTable" value="#{adminUserBean.userList}" var="user" styleClass="table" columnClasses="col30, ,col140,col140,col200,col140"> <h:column headerClass="col30"> <h:selectBooleanCheckbox value="#{user.selected}" id="check"> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup" /> </h:selectBooleanCheckbox> </h:column> <h:column> <h:commandLink styleClass="user-edit" value="#{user.name} #{user.surname}"> <f:setPropertyActionListener value="true" target="#{adminUserBean.edit}" /> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup check" /> </h:commandLink> </h:column> <h:column headerClass="col140"> <h:commandLink value="#{user.login}"> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup check" /> </h:commandLink> </h:column> <h:column headerClass="col140"> <h:commandLink value="#{user.permissions}"> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup check" /> </h:commandLink> </h:column> <h:column headerClass="col200"> <h:commandLink value="#{user.lastLogin}"> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup check" /> </h:commandLink> </h:column> <h:column headerClass="col140"> <h:commandLink styleClass="icon-status #{!user.active ? 'blocked' : user.isLogged ? 'logged' : 'offline'}" value="#{!user.active ? 'Nieaktywny' : user.isLogged ? 'Zalogowany' : 'Wylogowany'}"> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup check" /> </h:commandLink> </h:column> </h:dataTable>
过滤器:<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:f="http://java.sun.com/jsf/core"> <h:form> <div class="filters"> <h2>Filtruj wg</h2> <h:panelGroup id="filtr" styleClass="filters-group"> <div class="div-table"> <div class="div-cell"> <fieldset> <legend>od</legend> <a href="" class="icon icon-filter-off hidden" /> <h:inputText class="input-filtr date" value="#{adminUserBean.userSearchProvider.dateFrom}" /> </fieldset> </div> <div class="div-cell"> <fieldset> <legend>do</legend> <a href="" class="icon icon-filter-off hidden" /> <h:inputText class="input-filtr date" value="#{adminUserBean.userSearchProvider.dateTo}" /> </fieldset> </div> </div> <div class="div-table"> <div class="div-cell"> <fieldset> <legend>nazwa zawiera:</legend> <a href="" class="icon icon-filter-off hidden"></a> <h:inputText class="input-filtr" value="#{adminUserBean.userSearchProvider.name}" /> </fieldset> </div> </div> </h:panelGroup> <h:commandButton value="Wyszukaj" styleClass="btn btn-blue-back btn-big wyszukaj"> <f:ajax execute="filtr" listener="#{adminUserBean.search}" render=":table:usersTable" /> </h:commandButton> </div>
- p>
package com.example.bean @ManagedBean @SessionScoped @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) @Controller public class AdminUserBean implements Serializable { @PostConstruct public void init() { offset = 0; sortCol = 0; sortOrder = "asc"; cleanData(); setUsers(); reportSearchProvider = new ReportSearchProvider(); } public void setUsers() { try { if (userList == null || userList.size() == 0) { userList = new ArrayList<User>(); } userList.addAll(adminUserService.getUsers(userSearchProvider, offset, sortCol, sortOrder)); } catch (DAOException e) { e.printStackTrace(); } } public void search() { if (userSearchProvider != null) { refreshUserList(); } } private void refreshUserList() { offset = 0; userList.clear(); setUsers(); }
(我跳过了一些行,变量decl。等)
我使用纯JSF 2.2, Tomcat 8作为服务器(我不知道这是否重要)。我读过类似的问题,但我没有找到相同的例子,因为我的ajax有时工作,有时不。什么好主意吗?
看来我找到解决办法了。我在项目中使用nicescroroll插件,当过滤器高度大于窗口高度时,它变得可滚动,您不仅可以通过滚动条或鼠标滚轮滚动它,还可以通过鼠标左键抓取它并上下移动鼠标。事实证明,当我点击按钮并在上面做一点移动时,nicesscroll会阻止ajax执行。但是,当我再次单击而不做任何移动时(或当我通过enter提交时),请求执行,但不是ajax,而是正常的请求刷新整个页面。解决方案是,当鼠标按钮按下时,删除鼠标滚动,当鼠标按钮按上时,添加鼠标滚动:
$('input.wyszukaj').mousedown( function() {
$('.content-right-container').getNiceScroll().remove();
$('.content-right-container').css({'overflow':'hidden'});
}).mouseup( function() {
$('.content-right-container').niceScroll({
cursorcolor: '#969696',
cursorwidth: '4px',
cursorborder: '0',
cursorborderradius: '0',
grabcursorenabled: false,
touchbehavior: true,
cursordragontouch: true
});
});
效果很好。Ajax不再"挂"了。