像f viewaction中的f ajax?

时间:2015-04-26 17:21:58

标签: ajax jsf viewaction

我需要在执行f:viewaction时执行请求时显示加载图像,此声音在f:ajax内放置f:viewaction,但这是不可能的。

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

1 个答案:

答案 0 :(得分:1)

这里有一个概念性思维错误。只要未加载带图像的页面(图像所代表的任何内容与问题无关),就无法显示图像。为了显示图像,您需要确保首先完全加载包含图像的页面。只有当带有图像的页面完全加载时,然后才能调用所需的业务操作。

<f:viewAction>是不可或缺的。常见的方法是让JavaScript在达到<body>结束时,或在文档就绪/完成事件期间或窗口加载事件期间触发服务器端操作。确切的答案实际上取决于你手头的图书馆。当您使用PrimeFaces和/或jQuery时,代码可以疯狂地简化。

让我们假设“普通的香草”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"的脚本将重新定位到<body>的末尾,并在加载页面时调用隐藏的ajax命令按钮。

另见: