Как я могу условно отображать файл .js в h:head, если файл не был отображен после полного обновления страницы (FPR)?

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.

Для получения более подробной информации щелкните URL-адрес темы форума PrimeFaces ниже:

Uncaught TypeError: undefined is not a function

Я задаю этот вопрос, потому что я уже условно отображаю h:head на основе значений атрибутов bean-компонента, таких как следующие:

<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). в конечном итоге это необходимо решить, но я уверен, что есть способ отобразить файл .js через h: outputScript, если файл еще не отображается в h: head.

Веб-приложение использует следующее:

СНИМОК PrimeFaces 3.5, СНИМОК TomEE 1.5 (Tomcat 7.0.32), JUEL 2.2.5, СНИМОК OmniFaces 1.3

Пожалуйста, порекомендуйте.


person Howard    schedule 23.11.2012    source источник
comment
Если во время push-запроса не было отображено <h:head>, это объяснило бы проблему. Я бы предпочел использовать один <h:head>, который всегда отображается, и обернуть условно отображаемые дочерние элементы в <ui:fragment>. Попробуйте.   -  person BalusC    schedule 23.11.2012
comment
Некоторый тип сценария загрузки «может быть» необходим. Я думаю, что могу попытаться справиться с этим в моем фильтре входа/сервлета, который у меня уже есть. Если файл .js не обслуживается, установите usersController.pushJSFileServed = false; если false, то при загрузке я могу отправить запрос AJAX для обслуживания файла .js и снова отобразить p:socket.   -  person Howard    schedule 23.11.2012
comment
BalusC, если не ошибаюсь, у меня как минимум один h:head всегда рендерится. Все мои ресурсы (файлы js и css) отображаются соответствующим образом; просто этот файл push.js по какой-то причине не всегда отображается в h:head. Я попробую то, что вы рекомендовали, хотя, спасибо.   -  person Howard    schedule 23.11.2012
comment
@BalusC, я добавил один h:head, как вы предложили, и выполнил поиск и замену всех остальных h:head на ui:fragment и переместил все ui:fragment внутри одного h:head. Протестировано приложение, и все еще дублируется эта проблема. Я совершенно уверен, что если я смогу условно отобразить файл JS, когда он не отображается, это должно исправить/обойти эту проблему.   -  person Howard    schedule 23.11.2012
comment
Тогда это больше похоже на проблему PrimeFaces. Я бы в качестве теста добавил <h:outputScript library="primefaces" name="push/push.js" target="head" /> без условного рендеринга (если все прошло хорошо, он вообще не должен включаться дважды).   -  person BalusC    schedule 23.11.2012
comment
@BalusC, это решило проблему! В течение некоторого времени я хотел использовать h:outputScript просто так, и теперь я знаю, как и когда это делать, благодаря этому вопросу и вашему ответу/помощи. Пожалуйста, добавьте свой ответ, и я поставлю флажок рядом с вашим ответом. Как всегда, спасибо!   -  person Howard    schedule 23.11.2012


Ответы (1)


Это больше похоже на проблему PrimeFaces. Чтобы принудительно загружать push.js при каждом запросе в одном и том же представлении, вы можете явно добавить

<h:outputScript library="primefaces" name="push/push.js" target="head" /> 

без условного перевода. Если все прошло хорошо, т.е. он ведет себя хорошо в соответствии с механизмом обработки ресурсов JSF2, то он вообще не должен включаться дважды в тех случаях, когда он работал правильно.

person BalusC    schedule 23.11.2012