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】:这里存在概念性思维错误。只要未加载带有图像的页面,就无法显示图像(无论该图像代表什么都与问题无关)。为了显示图像,您需要先确保包含图像的页面已完全加载。只有当带有图像的页面完全加载时,然后您才能调用所需的业务操作。
<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"
的脚本将被重新定位到<body>
的末尾,并在页面加载时调用隐藏的ajax 命令按钮。
另见:
How to invoke a JSF managed bean on a html DOM event using native JavaScript?【讨论】:
为了在“动作”之后显示来自服务器的图像,页面必须完全加载。但从我从 cmets 制作的内容来看,只需要一个启动画面。这是可能的。 OP 提到<f:viewAction>
似乎是一个 XY 问题
@Kukeltje:据我所知,OP 希望在页面加载期间调用长期运行的业务操作。此答案可确保在调用操作之前显示图像。至于XY问题的X,我只能看到OP试图以这种方式覆盖的业务/服务/数据库层中的严重性能问题,但这超出了JSF的范围。
哈哈哈谢谢……谢谢。几乎在 Kòrsou 上庆祝了这一点。现在我们两周后出发。
感谢@BalusC。我认为有任何方法可以通过调用 ajax 来使用 f viewAction,但我认为这是不可能的。感谢您的代码。以上是关于f viewaction 中的 f ajax 之类的东西?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 h:inputText 中将参数传递给 f:ajax? f:参数不起作用