Разметка PrimeFaces остается после навигации в Liferay 7.0 - PullRequest
0 голосов
/ 15 мая 2018

Я заметил, что при навигации по GET со страницы с определенными компонентами PrimeFaces разметка этих компонентов будет отображаться в верхнем левом углу следующей страницы.

Эта проблема возникла со следующими компонентами (и, возможно, с другими):

  • 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 голосов
/ 15 мая 2018

Обновление: эта проблема была проверена как ошибка в проекте Liferay Faces и была исправлена ​​как часть Bridge Ext 5.0.3: FACES-3328 .

Объяснение

Эта проблема связана с несовместимостью между PrimeFaces (который изначально был разработан для веб-приложений) и Liferay 7.0 / SennaJS / Portlets.PrimeFaces предполагает, что он используется в среде веб-приложений, где он контролирует всю разметку на странице, поэтому многие из компонентов, использующих 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>

Однако в среде портлетов портлет имеет контроль только над разметкой портлета, которая является <div> внутри тега <body>.Но поскольку PrimeFaces предполагает среду веб-приложения, он все еще добавляет разметку к <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, однако это не было проблемой, поскольку каждая навигация вызывала бы полную загрузку страницы и все динамическиеэлементы, созданные JavaScript в PrimeFaces, будут уничтожены.Теперь с Liferay 7.0 движок одностраничных приложений SennaJS используется для того, чтобы гарантировать, что только необходимые части страницы загружаются и отображаются при навигации .Теперь, когда вы покидаете портлет PrimeFaces через SennaJS, все CSS PrimeFaces удаляются вместе с портлетом <div>.Динамические элементы не удаляются, а CSS PrimeFaces выгружается, поэтому он больше не может их скрывать.

Решения

Существует несколько возможных решений этой проблемы (я заказал их от лучших дохудшее):

Подробнее:

...