1

在执行 a 时,我需要在执行请求时显示加载图像f:viewaction,这听起来像是放在f:ajax里面f:viewaction,但这是不可能的。

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

1 回答 1

1

这里存在概念性思维错误。只要未加载带有图像的页面,就无法显示图像(无论该图像代表什么都与问题无关)。为了显示图像,您需要先确保包含图像的页面已完全加载。只有当带有图像的页面完全加载时,才能调用所需的业务操作。

<f:viewAction>不适合这个。常见的方法是让 JavaScript 在<body>到达结束时、在文档准备/完成事件期间或在窗口加载事件期间触发服务器端操作。确切的答案实际上取决于您手头的库。当您手头有 PrimeFaces 和/或 jQuery 时,代码可以被疯狂地简化。

让我们假设“plain vanilla” JSF/JS,这里有一个 hacky 方法来实现这个要求:

<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"将被重新定位到末尾并调用隐藏的 ajax 命令按钮。<body>

也可以看看:

于 2015-04-27T07:43:19.557 回答