如果在全页刷新 (FPR) 后未呈现文件,我如何有条件地在 h:head 中呈现 .js 文件?
Posted
技术标签:
【中文标题】如果在全页刷新 (FPR) 后未呈现文件,我如何有条件地在 h:head 中呈现 .js 文件?【英文标题】:How can I conditionally render .js file in h:head, if file was not rendered after Full Page Refresh (FPR)? 【发布时间】:2012-11-12 00:01:25 【问题描述】:PrimeFaces 有条件地在 h:head 中呈现以下内容:
<script type="text/javascript" src="/webapp/javax.faces.resource/push/push.js.jsf?ln=primefaces"><!--//--></script>
当 PrimeFaces p:socket 组件被添加到 JSF/xhtml 页面时。我的一些页面刷新,导致此 push.js 文件“未”在 h:head 中呈现。
当 push.js 文件“未”呈现时,我想有条件地呈现 push.js 文件以尝试修复/解决我在使用 PrimeFaces Push 时遇到的问题。
更多详情请点击下方PrimeFaces论坛主题网址:
Uncaught TypeError: undefined is not a function
我问这个问题,是因为我已经在根据bean属性值有条件地渲染h:head了,比如下面这样:
<h:head rendered="#!pageNavigationController.gmaps and !pageNavigationController.gmapsAutoComplete">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="refresh" content="#session.maxInactiveInterval;url=pf_viewExpired.jsf" />
<title><h:outputText escape="false" value="MCMS"/></title>
<h:outputStylesheet name="css/mcms.css"/>
<h:outputScript name="js/mcms.js"/>
<h:outputScript name="js/addUsingTemplate.js"
rendered="#pageNavigationController.isPageSelected('/orders/pf_AddUsingTemplate.xhtml')"/>
</h:head>
也许我对 h:head 的使用使容器 TomEE 1.5 SNAPSHOT 难以为 .js 文件提供服务,因为页面上多个 h:head 的条件呈现,或者这实际上可能是 PrimeFaces Push ( Atmosphere) 问题最终需要解决,但我确信有一种方法可以通过 h:outputScript 渲染 .js 文件,如果该文件尚未在 h:head 中渲染。
Web 应用程序正在使用以下内容:
PrimeFaces 3.5 快照、TomEE 1.5 快照(Tomcat 7.0.32)、JUEL 2.2.5、OmniFaces 1.3 快照
请指教。
【问题讨论】:
这有什么帮助吗:showcase-omnifaces.rhcloud.com/showcase/components/… ? 如果在推送请求期间没有呈现<h:head>
,那么这可以解释问题。我宁愿使用一个始终渲染的<h:head>
,并将有条件渲染的子级包装在<ui:fragment>
中。试一试。
“可能”需要某种类型的加载脚本。我想我可能会尝试在我已经安装的登录/servlet 过滤器中处理这个问题。如果没有提供 .js 文件,则设置 usersController.pushJSFileServed = false;如果为 false,则 onload,我可以发出 AJAX 请求来提供 .js 文件并再次渲染 p:socket。
BalusC,如果我没记错的话,至少我的一个 h:head 总是被渲染。我的所有资源(js 和 css 文件)都被适当地渲染了;只是这个 push.js 文件并不总是在 h:head 中呈现,无论出于何种原因。不过我会试试你推荐的,谢谢。
@BalusC,我按照你的建议添加了一个 h:head,并用 ui:fragment 搜索并替换所有其他 h:head,并将所有 ui:fragment 移动到一个 h 中:头。经过测试的应用程序,仍然重复了这个问题。我很确定,如果我可以在 JS 文件未渲染时有条件地渲染它,那么应该可以解决/解决这个问题。
【参考方案1】:
这似乎更像是一个 PrimeFaces 问题。为了在同一视图上的每个请求上强制加载push.js
,您可以显式添加一个
<h:outputScript library="primefaces" name="push/push.js" target="head" />
没有条件渲染。如果一切顺利,即它按照 JSF2 资源处理机制表现良好,那么在它正常工作的情况下根本不应该包含两次。
【讨论】:
以上是关于如果在全页刷新 (FPR) 后未呈现文件,我如何有条件地在 h:head 中呈现 .js 文件?的主要内容,如果未能解决你的问题,请参考以下文章