2013-02-24 3 views
1

У меня есть простая проблема, когда я хочу отображать всплывающее окно, если что-то пошло не так в моем управляемом bean-компоненте. Боб содержит список исключений, которые могут быть подняты, с использованием методов getter/setter.визуализировать richfaces popupPanel после завершения обработки bean-метода

XHTML выглядит следующим образом

 <rich:panel> 
    <h:form> 
     <a4j:commandButton value="Compute Mission" 
      action="#{missionHandler.generateMissionFeasability}" 
      render="popupPanel"> 
     </a4j:commandButton> 
    </h:form> 
    </rich:panel> 
    <rich:popupPanel id="popupPanel" modal="true" autosized="true" 
    resizeable="false" moveable="false" rendered="#{not empty missionHandler.exceptions}"> 
    <f:facet name="header"> 
     <h:outputText value="Exceptions raised during the processing " /> 
    </f:facet> 
    <f:facet name="controls"> 
     <h:outputLink value="#" 
      onclick="#{rich:component('popupPanel')}.hide();return false;"> 
     </h:outputLink> 
    </f:facet> 
    </rich:popupPanel> 

Как вы видите, у меня есть кнопки управления, которые должны вызывать метод generateMissionFeasibility в бобе. Этот метод будет (среди прочего) добавлять исключение в список исключений.

Я хотел бы проверить список (если он пустой или нет), чтобы отобразить всплывающее окно

Код выше не работает, потому что я думаю, что всплывающее окно оказывается до конца метода в бобе, и список пуст в начале.

+0

Попробуйте герметизирующего панель внутри, например, '<ч: panelGroup ID =«группа»>' и изменения 'визуализации 'атрибут' commandButton' для 'render =" group "'. – partlov

ответ

1

Код не работает, поскольку первый раз представление будет отображаться, missionHandler.exceptions будет пустым, а это значит, что popupPanel никогда не попадает в браузер. Последующие запросы к reRender popupPanel не будут выполнены, поскольку компонент не найден в DOM.

Для компонента, который должен быть обновлен ajax, он должен быть уже в DOM в браузере, так работает ajax. Таким образом, решение состоит в том, чтобы обернуть содержимое всплывающей панели в компонент, который всегда будет отображаться.

Это в стороне, даже если вы получили рендеринг правильно, ваше всплывающее окно будет помещено только в DOM. Вы на самом деле нужно вызвать show() на всплывающее окно, чтобы заставить его showup

Чтобы достичь того, чего вы хотите, однако, лучшей альтернативой будет

  1. условно отобразить всплывающее окно с помощью JavaScript. Если условие выполнено, для всплывающего окна вызывается функция show(). В противном случае будет вызвана пустая функция do-nothing javascript.

    <a4j:commandButton value="Compute Mission" action="#missionHandler.generateMissionFeasability}" 
        oncomplete="#{not empty missionHandler.exceptions ? #{rich:component('popupPanel')}.show()" : doNothing()}" render="popupPanel"> 
    </a4j:commandButton> 
    

    Для doNothing ЯШ:

    <script> function doNothing(){} <script/> 
    
  2. Возьмите состояние рендеринга из модальной панели

EDIT: Кроме того, атрибут на всплывающей компонента show может основываться в том же состоянии EL, что и атрибут oncomplete

+0

отлично, спасибо – facewindu

3

Один из способов сделать всплывающую панель будет показано, как только оказывается, чтобы изменить

rendered="#{not empty missionHandler.exceptions}" 

в

show="#{not empty missionHandler.exceptions}" 
+0

+1, полностью упустил 'show' attr. – kolossus

Смежные вопросы