2016-09-01 12 views
0

Недавно у меня возникла проблема с одним из моих. У меня есть отдельный xhtml, содержащий условно отображаемые значки/ссылки для отображения разных видов всплывающих окон. Этот xhtml в основном представляет собой контейнер для определенных типов всплывающих окон, которые я могу включить на разные страницы. Представленные условия (и переданный параметр ui:) позволяют показывать только соответствующие значки/ссылки в зависимости от того, где этот xhtml включен. Это мешает мне писать много разных ui: включает на каждую страницу.JSF/EL оценивает onClick во время рендеринга страницы. Зачем?

Для некоторых всплывающих окон необходимо подготовить некоторые данные, которые выполняются с помощью атрибута onclick a4j: commandLink. Затем OnComplete покажет фактическое всплывающее окно следующим образом:

<a4j:commandLink render="clientGroupMemberInfoPopup" rendered="#{assignmentDO.clientGroupMember}" 
       onclick="#{clientInfoBean.registerGmClientGroupMember(assignmentDO.gmClientGroupMemberDO)}" 
       oncomplete="RichFaces.ui.PopupPanel.showPopupPanel('ClientInfo')"> 
    <h:graphicImage value="/img/icons/icon_info_sm.png" rendered="#{!printFriendly}"/> 
</a4j:commandLink> 

Соответствующий компонент:

@ManagedBean 
@ViewScoped 
public class ClientInfoBean { 

    @EJB 
    private ClientService clientService; 

    @Getter 
    @Setter 
    private ClientContextDO clientContextDO; 

    @Getter 
    @Setter 
    private GmClientGroupMemberDO gmClientGroupMemberDO; 

    @Getter 
    @Setter 
    private Long clientId; 

    public void registerGmClientGroupMember(final GmClientGroupMemberDO aGroupMember) { 
     gmClientGroupMemberDO = aGroupMember; 
     clientContextDO = clientService.findByClientId(gmClientGroupMemberDO.getClientId()); 
    } 

} 

В этом случае выше оказанной состояния a4j: commandLink оценивается как истина. Однако ... onclick оценивается каждый раз, на каждой странице включается этот xhtml, как только визуализируемое условие оценивается как true. Даже когда страница все еще загружается, и никто еще ничего не нажал!

Почему? И каков наилучший способ предотвратить это? Для подготовки всей информации, необходимой для всплывающего окна, есть несколько относительно тяжелых db-файлов. Я только хочу, чтобы этот материал был сделан в тот момент, когда кто-то на самом деле кликов по ссылке для всплывающего окна, а не на этапах рендеринга страницы.

ответ

1

Существует дубликат этого вопроса, я уверен, но я не могу его найти. Я удалю этот ответ, когда BalusC помечает его как таковой.

Onclick предназначен для выполнения javascript, а не для доступа к серверному методу. Таким образом, EL в нем оценивается как выражение значения, а не выражение метода. Таким образом, результат рассматривается как javascript. Следовательно, он просто оценивается во время рендеринга и повторно оценивается при нажатии.

Решение изменить onclick к action

<a4j:commandLink render="clientGroupMemberInfoPopup" rendered="#{assignmentDO.clientGroupMember}" 
       action="#{clientInfoBean.registerGmClientGroupMember(assignmentDO.gmClientGroupMemberDO)}" 
       oncomplete="RichFaces.ui.PopupPanel.showPopupPanel('ClientInfo')"> 
    <h:graphicImage value="/img/icons/icon_info_sm.png" rendered="#{!printFriendly}"/> 
</a4j:commandLink> 
+0

Ahh на, я попытался искал подобный вопрос, но я не мог найти его либо. Во всяком случае, ваше предложение имеет смысл, и оно работает, поэтому я соглашусь с вашим собеседником! :) – Joost

+0

Я всегда использую Google для поиска SO: 'site: stackoverflow.com search terms'. Поиск в SO похож на хромого. –

+0

Мне, но я все еще не мог найти его. И есть еще больше «дубликатов», чем только этот. Посмотрите на улучшение дубликата Q/A, чтобы его было легче найти. – Kukeltje