JSF + Primefaces: проблема с визуализированными компонентами с помощью ajax

EDIT
Не удается заставить rendered правильно работать с update атрибутами. Вот мои коды

        <ui:define name="left">
            <h:form>
                <p:commandLink value="Hey"
                actionListener="#{bean.setRenderComment}"
                update="comment"/>
            </h:form>
       </ui:define>
       <ui:define name="right">
            <h:panelGroup id="comment" rendered="#{bean.renderComment}">
                hello
            </h:panelGroup>
       </ui:define>

renderComment — это логические атрибуты внутри bean. setRenderComment в основном переключает состояние renderComment вот так

this.renderComment = !this.renderComment;

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


person Thang Pham    schedule 20.09.2010    source источник


Ответы (2)


В своих проектах я использую не Primefaces, а Richfaces. Поэтому я действительно не знаю, как Primefaces выполняет процесс обновления. Однако у меня есть идея, которую можно легко проверить.

Ваша проблема может быть связана с тем, что компонент для повторного рендеринга (т. е. обновление) не найден на HTML-странице. Если ваш атрибут rendered равен false, то <SPAN> с идентификатором comment не интегрируется в созданную HTML-страницу. Таким образом, когда запрос Ajax получен на стороне клиента, механизм Ajax не может обновить этот <SPAN>, поскольку он не найден.

Итак, что вы можете сделать, так это всегда отображать panelGroup и перемещать атрибут rendered во вложенный <h:outputText>, содержащий сообщение Hello.

Вот что я предлагаю:

<h:panelGroup id="comment">
    <h:outputText value="Hello" rendered="#{bean.renderComment}"/>
</h:panelGroup>

Таким образом, группа panelGroup всегда будет обновляться после вызова Ajax и будет содержать сообщение Hello или нет, в зависимости от значения атрибута renderComment вашего компонента.

person Romain Linsolas    schedule 21.09.2010
comment
Спасибо. Оно работает :). Причина, по которой я использую panelGroup, заключается в том, что у меня есть много компонентов, которые я хочу render включать или выключать, используя только один атрибут rendered. Если мне придется это сделать, я думаю, я мог бы просто вытащить panelGroup. Большое спасибо чувак :D - person Thang Pham; 21.09.2010

Поскольку компонент с идентификатором comment не является одним из дочерних элементов формы (компонент UINamingContainer), вам необходимо добавить к идентификатору префикс :, чтобы указать JSF сканировать с «верхнего уровня».

Это должно сделать:

<p:commandLink value="Hey"
    actionListener="#{bean.setRenderComment}"
    update=":comment" />
person BalusC    schedule 20.09.2010
comment
О, вау. Я не знал, что update работают только на одном уровне. Что делать, если у меня есть несколько уровней. Пробую ::comment, но не получается. Не могли бы вы взглянуть на мой обновленный пост, пожалуйста? - person Thang Pham; 21.09.2010
comment
@Harry: romaintaz прибил это. - person BalusC; 21.09.2010