f viewaction 中的 f ajax 之类的东西?

Posted

技术标签:

【中文标题】f viewaction 中的 f ajax 之类的东西?【英文标题】:Something like f ajax within f viewaction? 【发布时间】:2015-07-05 00:41:26 【问题描述】:

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

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

【问题讨论】:

您想在页面加载时显示加载图像?或者当命令组件触发请求时\ 是的。 f viewaction 在页面加载时执行。但是这个 f viewaction 向服务器发送请求(到 ManagedBean) viewaction 运行在从服务器启动的服务器上,而不是从客户端启动,因此它不需要 ajax。那么你想在页面加载期间或之后显示一些东西吗?那么请调整你的问题 @Kukeltje 我想在加载页面时显示一张图片。 【参考方案1】:

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

&lt;f:viewAction&gt; 不适合这个。常见的方法是让 javascript 在到达&lt;body&gt; 的结尾时、在文档准备/完成事件期间或在窗口加载事件期间触发服务器端操作。确切的答案实际上取决于您手头的库。当您手头有 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" 的脚本将被重新定位到&lt;body&gt; 的末尾,并在页面加载时调用隐藏的ajax 命令按钮。

另见:

How to invoke a JSF managed bean on a html DOM event using native JavaScript?

【讨论】:

为了在“动作”之后显示来自服务器的图像,页面必须完全加载。但从我从 cmets 制作的内容来看,只需要一个启动画面。这是可能的。 OP 提到 &lt;f:viewAction&gt; 似乎是一个 XY 问题 @Kukeltje:据我所知,OP 希望在页面加载期间调用长期运行的业务操作。此答案可确保在调用操作之前显示图像。至于XY问题的X,我只能看到OP试图以这种方式覆盖的业务/服务/数据库层中的严重性能问题,但这超出了JSF的范围。 哈哈哈谢谢……谢谢。几乎在 Kòrsou 上庆祝了这一点。现在我们两周后出发。 感谢@BalusC。我认为有任何方法可以通过调用 ajax 来使用 f viewAction,但我认为这是不可能的。感谢您的代码。

以上是关于f viewaction 中的 f ajax 之类的东西?的主要内容,如果未能解决你的问题,请参考以下文章

如何显示 f:viewAction 的等待指示器?

何时使用 f:viewAction / preRenderView 与 PostConstruct?

根据 f:viewParam 有条件地调用 f:viewAction

f:viewAction 被忽略,当 commandButton 导航到页面时

何时使用 preRenderView 与 viewAction?

h:selectOneMenu 中的 f:ajax 监听方法没有执行