我注意到当我从具有某些PrimeFaces组件的页面通过GET导航时,这些组件的标记将出现在下一页的左上角。
以下组件(可能还有其他组件)发生了这个问题:
p:tooltip
p:columnToggler
p:notifiactionBar
p:selectOneMenu
p:autoComplete
p:confirmDialog
p:dialog
p:draggable
p:menuButton
p:selectCheckboxMenu
p:selectOneMenu
p:splitButton
有什么方法可以阻止此标记在导航后出现?
答案 0 :(得分:3)
此问题是由于PrimeFaces(最初是为webapps设计)和Liferay 7.0 / SennaJS / Portlets之间不兼容造成的。 PrimeFaces假定它在webapp环境中使用,它可以控制页面上的所有标记,因此许多使用JavaScript帮助渲染的组件将其标记附加到<body>
标记。
这是PrimeFaces正在做的超简化版本:
<body>
<script>
var dynDiv = document.createElement("div");
var text = document
.createTextNode("I was created dynamically via JavaScript!");
dynDiv.appendChild(text);
document.body.appendChild(dynDiv);
</script>
</body>
但是,在portlet环境中,portlet只能控制<div>
标记内的<body>
portlet标记。但是,由于PrimeFaces假设一个webapp环境,它仍然将标记添加到<body>
:
<body>
<div id="myPrimeFacesPortlet">
<script>
var dynDiv = document.createElement("div");
var text = document
.createTextNode("I was created dynamically via JavaScript!");
dynDiv.appendChild(text);
document.body.appendChild(dynDiv);
</script>
</div>
</body>
在Liferay 7.0之前,这不是问题,因为每次导航都会导致整页加载,并且PrimeFaces的JavaScript创建的所有动态元素都将被破坏。现在使用Liferay 7.0 the Single Page Application engine of SennaJS is used to make sure that only necessary parts of the page are loaded and rendered on navigation。现在,当您通过SennaJS离开PrimeFaces portlet时,所有PrimeFaces CSS都将与portlet <div>
一起被删除。动态元素未被删除,PrimeFaces CSS被卸载,因此无法再隐藏它们。
这个问题有几种可能的解决方案(我从最好到最差的顺序排序):
如果组件具有appendTo
属性,请确保将标记附加到portlet标记内的元素:appendTo="@this"
,appendTo="@id(#{portletNamespace})"
(对于最外层的<div>
如果appendTo="@form"
看起来不起作用,那么(或appendTo="@root"
)也可以正常工作(参见the PF User Guide (p. 558) for more details on the "Search Expression Framework")。
使用CSS永久隐藏动态元素。要确保在SennaJS导航中不删除CSS,请设置data-senna-track="permanent"
:
<h:head>
<!--You'll need to look at the CSS for each element (not just tooltip)
to figure out what CSS classes should be hidden. -->
<style id="hidePrimeFacesLeftoverMarkupWorkaroundCSS"
data-senna-track="permanent">
.ui-tooltip {
display: none;
}
</style>
</h:head>