Что-то вроде f ajax внутри f viewaction?

Мне нужно показать загрузку изображения при выполнении запроса при выполнении f:viewactionэтот звук как поставить f:ajax в f:viewaction, но это невозможно.

<ui:define name="metadata">
    <f:metadata>
        <f:viewAction
            action="#{subscriptionManagementMB.loadSubscriptionManagement()}" />
    </f:metadata>
</ui:define>

1 ответ

Решение

Здесь есть концептуальная ошибка мышления. Вы не можете показать изображение, пока страница с изображением не загружена (то, что это изображение представляет, не имеет отношения к проблеме). Чтобы показать изображение, вы должны убедиться, что страница с изображением полностью загружена первой. Только когда страница с изображением полностью загружена, вы можете вызвать желаемое деловое действие.

<f:viewAction> для этого не подходит. Общий подход состоит в том, чтобы позволить JavaScript вызвать действие на стороне сервера, когда конец <body> достигнут или во время события готовности / завершения документа, или во время события загрузки окна. Точный ответ действительно зависит от того, какие библиотеки у вас под рукой. Код может быть безумно упрощен, когда у вас под рукой PrimeFaces и / или jQuery.

Давайте предположим "простой ваниль" JSF/JS, вот хакерский способ, как выполнить требование:

<h:body>
    <h:panelGroup id="content">
        <h:graphicImage name="loading.gif" rendered="#{not bean.loaded}" />

        <ui:fragment rendered="#{bean.loaded}">
            ... (put your content here)
        </ui:fragment>
    </h:panelGroup>

    <h:form id="form" style="display:none;">
        <h:commandButton id="button" action="#{bean.onload}">
            <f:ajax render=":content" />
        </h:commandButton>
    </h:form>

    <h:outputScript target="body">
        document.getElementById("form:button").onclick();
    </h:outputScript>
</h:body>

Изображение показывает изображение загрузки. Форма, которая скрыта с помощью CSS display:none, содержит кнопку команды ajax, которая обновляет содержимое. Сценарий с target="body" будет перемещен в конец <body> и вызовите скрытую командную кнопку ajax при загрузке страницы.

Смотрите также:

Другие вопросы по тегам