Выполнять JavaScript после каждой обратной передачи JSF ajax

У меня есть функция javascript, которую я хотел бы выполнить после каждой асинхронной обратной передачи в JSF 2.

Я выполнил следующее, чтобы гарантировать, что каждый полнотекстовый обратный вызов будет выполнен:

jQuery(document).ready(mahFunction);

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

У меня возникли проблемы с поиском информации об этом, возможно, потому, что я использую неправильные термины. Раньше я был разработчиком ASP.NET, и я называю эти термины "полной обратной почтой" и "частичной обратной передачей", где, похоже, другие разработчики JSF не используют такие термины.

Ответ 1

Вы можете зарегистрировать его как обработчик обратного вызова ajax JSF jsf.ajax.addOnEvent:

<script>
    jsf.ajax.addOnEvent(foo);
</script>

с

<script>
    function foo(data) {
        var ajaxStatus = data.status; // Can be "begin", "complete" and "success".

        switch (ajaxStatus) {
            case "begin": // Right before sending ajax request.
                // ...
                break;

            case "complete": // Right after receiving ajax response.
                // ...
                break;

            case "success": // When ajax response is successfully processed.
                // ...
                break;
        }
    }
</script>

где объект data имеет несколько полезных свойств XHR, которые описаны в таблице 14-4 спецификации JSF 2.0 (нажмите кнопку For Оценка). Здесь выдержка релевантности:

ТАБЛИЦА 14-4 Информационная информация о событиях

    Name           Description/Value
    -------------  ----------------------------------------------------
    type           "event"
    status         One of the events specified in TABLE 14-3
    source         The DOM element that triggered the Ajax request.
    responseCode   Ajax request object ‘status’ (XMLHttpRequest.status); 
                   Not present for "begin" event;
    responseXML    The XML response (XMLHttpRequest.responseXML); 
                   Not present for "begin" event;
    responseText   The text response (XMLHttpResponse.responseTxt);
                   Not present for "begin" event;

В качестве альтернативы, XHTML-декларативный способ состоял бы в том, чтобы просто вставить вызов script в компонент JSF с помощью id и позволить аякс-вызову повторно отобразить его. Компонент должен, в свою очередь, визуализировать script на основе FacesContext#isPostback().

<h:form>
    <h:commandButton value="Submit" action="#{bean.submit}">
        <f:ajax render=":myscript">
    </h:commandButton>
</h:form>

<h:panelGroup id="myscript">
    <h:outputScript rendered="#{facesContext.postback}">foo();</h:outputScript>
</h:panelGroup>

Большинство библиотек компонентов, однако, лучше абстрагировали поддержку для этого. Поскольку вы не указали, какой из них вы используете, чтобы дать более подходящий ответ, вот только случайный пример, основанный на PrimeFaces.

<p:commandButton value="Submit" action="#{bean.submit}" oncomplete="foo();" />

Обратитесь к документации библиотеки компонентов, которую вы используете.

См. также: