在Liferay 7.0导航后,PrimeFaces标记仍然存在

时间:2018-05-15 19:27:25

标签: jsf primefaces liferay liferay-7 senna.js

我注意到当我从具有某些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

有什么方法可以阻止此标记在导航后出现?

1 个答案:

答案 0 :(得分:3)

更新:此问题已在Liferay Faces项目中被验证为错误,并已作为Bridge Ext 5.0.3的一部分进行修复:FACES-3328

解释

此问题是由于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>
    
  • Disable SennaJS for your Portlet or your entire Portal.

更多信息: