отображаемый атрибут вызывается снова и снова в заголовке (EDIT: h: ссылка против h: commandLink и атрибуты сеанса для навигации) - PullRequest
0 голосов
/ 31 января 2012

У меня есть элемент ap: poll в заголовке моего приложения JSF2, который запускается каждую секунду, чтобы проверить время окончания аукциона (которое может измениться в любой момент в бэк-офисе, и я должен оставаться над ним). заметив теперь, что всякий раз, когда опрос запускает, вызываются все «визуализированные» методы в заголовке. Это почему? И как это можно остановить?

Часть кода, которая может иметь отношение к этому:

<td>Remaining Time: 
    <h:outputText id="remTime" value="#{auctionBean.remainingTime}"/>       
    <p:poll listener="#{auctionBean.calcRemainingTime()}" interval="1" update="remTime" />
</td>

РЕДАКТИРОВАТЬ:

Еще немного о моих функциональных требованиях. У меня есть домашняя страница с восемью ссылками: 5 в верхнем колонтитуле и 3 в нижнем колонтитуле. У меня также есть поисковый компонент, который мне нужно показать - как только пользователь войдет в систему - для 3 из этих ссылок. Я делаю это, передавая в сеансе атрибут fromPage и принимая решение показать или скрыть компонент поиска.

Когда я использую h: commandLink для всех ссылок на мою домашнюю страницу, все работает нормально. Но возникает другая проблема: URL-адреса JSF тянутся одним кликом. Это известная проблема, поэтому я не буду подробно ее объяснять.

OK. Поэтому я перешел на h: link. Теперь URL меняется каждый клик и ведет себя нормально. Но для каждого клика все «исходные» методы - для всех 8 ссылок на домашней странице - вызываются слева направо, сверху вниз. Да, все 8 «исходящих» методов вызываются для каждого клика. URL-адрес изменяется правильно, и страница отображается правильно, но атрибут «fromPage» в сеансе всегда относится к последней вызванной ссылке: той, что внизу справа.

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

OK. Я могу просто отказаться от URL, показывающего правильную страницу, переключиться обратно на commandLinks и продолжить свою жизнь. Но я хочу сделать это правильно и помочь своим пользователям. Есть ли решение?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

h:link использует то, что в спецификации JSF называется «упреждающая навигация». Из спецификации:

Случай навигации разрешается во время Фаза Render Response до того, как клиент активирует ссылку (и может никогда не активировать ссылку).

Таким образом, вы можете использовать правила навигации так же, как с h:commandLink действиями. Однако, если ваш результат является выражением метода EL, ваш «метод результата», как вы его вызвали, будет вызван во время фазы ответа рендеринга. Это ожидаемое поведение.

Альтернатива, которая, на мой взгляд, может сработать, заключается в добавлении параметра запроса к результату и добавлении f:viewParam на целевую страницу. Например:

page1.xhtml

<h:link value="Page 2" outcome="page2?fromPage=page1"/>

page2.xhtml

<f:metadata>
    <f:viewParam name="fromPage" value="#{page2.fromPage}"/>
</f:metadata>

Теперь вы можете использовать #{page2.fromPage} для условного рендеринга. Это, вероятно, также позволяет избежать необходимости хранить fromPage в сеансе.

0 голосов
/ 31 января 2012

Использовать частичную обработку с атрибутом процесса, обрабатывать только то, что необходимо.

...