JSF ajax并不总是触发,而是重新加载页面



我有一个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不再"挂"了。

相关内容

  • 没有找到相关文章

最新更新