Выполнять JavaScript после каждой обратной передачи JSF ajax - PullRequest
13 голосов
/ 19 апреля 2011

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

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

jQuery(document).ready(mahFunction);

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

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

1 Ответ

30 голосов
/ 19 апреля 2011

Вы можете зарегистрировать его как обработчик обратного вызова 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 (щелкните ссылку для оценки ).Вот выдержка из релевантности:

ТАБЛИЦА 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-декларативным способом было бы просто встроить вызов сценария в компонент JSF с id и позволить вызову ajax выполнить его повторную визуализацию.Компонент должен, в свою очередь, отображать сценарий условно на основе 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();" />

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

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...