Отмена ajax-вызова JSF

#ajax #events #jsf

#ajax #Мероприятия #jsf

Вопрос:

У меня есть f:ajax тег внутри h:inputText тега, который вызывает ajax-вызовы для событий keyup :

 <h:inputText id="searchinput" value="#{tvShowForm.name}">
  <f:ajax event="keyup" render="results" listener="#{tvShowForm.search}" />
</h:inputText>
  

Каждый вызов занимает достаточно времени, чтобы пользователь набрал несколько символов до завершения первого вызова.

Есть ли способ отменить текущий вызов ajax (и поставленные в очередь), чтобы последнее событие keyup немедленно выполняло вызов ajax?

Ответ №1:

Похоже, вы хотите объединить события, например, это будет ждать полсекунды, прежде чем запускать ajax-запрос, и любой ввод, введенный в этот момент, будет включен. Но вы не будете запускать ajax-запрос для каждого введенного символа.

     <h:inputText onkeyup="keyupHandler();"/>
    ...
    <script>
    var keystrokeTimeout;

    keyupHandler = function(event) {

        var minChars = 4;
        var len = $(this).val().length;
        if((len != 0) amp;amp; (len < minChars)) {
            return;
        }

        var ajaxRequest = function() {
            jsf.ajax.request('results', null, {
                execute: 'results',
                render: 'results'
            });
        }
        clearTimeout(keystrokeTimeout);
        keystrokeTimeout = setTimeout(ajaxRequest, 500); // millisecs
    }
    </script>
  

Это отдаленно похоже на то, что вы хотите сделать?

РЕДАКТИРОВАТЬ: Другое предложение заключается в том, чтобы вы проверили функциональность Richfaces 4 a4j: queue. Это позволяет комбинировать события, например, в сценарии ввода, если вы опирались на клавиатуру, когда завершается текущий ajax-запрос, будет отправлен только один дополнительный запрос. Также можно указать задержку запроса и игнорировать устаревшие ответы. Большая ошибка, которую Richfaces не делает (которую делают primefaces), заключается в том, что RF использует ту же базовую очередь, что и реализация JSF, поэтому у вас нет риска обработки не по порядку.

Я ценю, что если вы еще не используете эту библиотеку, это не маленький шаг.

Комментарии:

1. Спасибо Oversteer, это именно то, что я в итоге делал тем временем ^^. Если через несколько дней не будет опубликовано лучшего решения, я буду придерживаться его и назначу вам награду.