2015-07-13 4 views
0

У меня есть dataTable и фильтр с несколькими входами. В фильтре у меня есть commandButton с ajax. Ajax запускает метод из bean, который ищет базу данных для записей, которые соответствуют критериям фильтра, и отображает dataTable. Проблема в том, что вызов ajax не работает всегда. Я знаю, это странно, для меня тоже, но это реально. И не всегда я имею в виду, что пусть говорят, что я делаю 5 запросов (я нажимаю 5 раз командуLink и работает ajax, данные меняются, метод из bean-горит), и чем в 6-й раз он не работает, ничего не происходит (запрос от клиента отсутствует side, method from bean not called), я нажимаю еще раз и до сих пор ничего не происходит, и пусть говорят, когда нажимают на него в 3 раза, но не с помощью ajax, а путем обычной отправки и перезагрузки всей страницы. Цифры, которые я дал, не всегда одинаковы, иногда самый первый запрос, который я делаю, не работает, и иногда я работаю много раз без этой ошибки. Некоторый код:JSF 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> 
    

  • боб:

    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, а иногда нет. Любые идеи?

+0

Вы проверили консоль браузера для любых ошибок JS или других подсказок? – BalusC

+0

Да, ошибок нет. – pawel

+0

Возможно ли, что метод bean загружает слишком много данных, чтобы он длился долго для запроса ajax? – pawel

ответ

0

Кажется, я нашел решение. Я использую плагин nicescroll в проекте, и когда высота фильтра больше высоты окна, он становится прокручиваемым, и вы можете прокручивать его не только полосой прокрутки или колесиком мыши, но и захватом ее левой кнопкой мыши и перемещением мыши вверх и вниз. Оказалось, что когда я нажимаю на кнопку и делаю небольшое движение по ней, nicescroll каким-то образом блокирует выполнение ajax. Но когда я нажимаю еще раз, не делая никаких действий (или когда я отправляю по вводу), запрос выполняется, но не с помощью ajax, а обычный запрос, обновляющий всю страницу. Решение просто удалить nicescroll, когда кнопка мыши нажата на кнопку и добавить nicescroll когда кнопка мыши вверх:

$('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 больше не «висит».

Смежные вопросы