2016-05-12 3 views
0

Я использую кнопку p: с действием onclick. (Я не могу перейти к р: CommandButton, из-за унаследованным итоговому навигации в лицах-config.xml и пользовательская навигация истории в БД):p: кнопка с onclick javascript hook

<p:remoteCommand name="unlock_tt" actionListener="#{ttEntityMBean.unlock()}"/> 
<p:button value="#{msgs['button.ok']}" outcome="#{ttEntityMBean.navigationMenuItemToRedirect.navigationRule}" onclick="unlock_tt()"/> 

порожденном primefaces Javascript выглядит как

onclick="unlock_tt(); window.open(....)" 

И после нажатия кнопки unlock_tt() в браузере, инициированном, но немедленно разбитого по переадресации страницы, так что поддерживаемый java-метод не выполнялся. Должен ли я сделать unlock_tt() или java call async, чтобы убедиться, что он будет выполнен до того, как браузер покинет страницу?

Upd: Я имею в виду использовать р: CommandButton, если можно получить на просмотр идентификатор programically, как в этом вопросе:

Programmatically get navigation case <to-view-id> from faces-config.xml by outcome

<p:commandButton action="#{ttEntityBean.unlock()}"/> 
public String unlock() { 
    //some business logic 
    return OutcomeResolverHelper.getRuleFor(navigationMenuItemToRedirect.navigationRule) 
} 

Это должно уменьшить число из запросов

ответ

0

Самый простой способ - переход от кнопки p: to к p: commandButton, которая позволяет выполнить некоторый Java-код в методе действий перед перенаправлением. Ядро programmical перевод навигационного правила, определенные в лицах-config.xml к базовому URL, пригодный для использования в explisit JSF-2.0 стиле:

//receive base url from <to-view-id> tag 
public static String resolveOutcomeRule(String ruleName) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ConfigurableNavigationHandler configNavHandler = (ConfigurableNavigationHandler)context.getApplication().getNavigationHandler(); 
    NavigationCase navCase = configNavHandler.getNavigationCase(context, null, ruleName); 
    return navCase.getToViewId(context); 
} 
//decorate it with faces-redirect=true and our custom navigation 
public static String resolveOutcome(NavigationMenuItem item) { 
    return resolveOutcomeRule(item.getNavigationRule()) + "?faces-redirect=true&menu=" + item.getId(); 
} 
//controller-method 
public String cancelEditTT() { 
    super.unlock(); 
    return FacesUtil.resolveOutcome(getNavigationMenuItemToRedirect()); 
} 
//new jsf button: 
<p:commandButton value="#{msgs['button.ok']}" action="#{ttEntityMBean.cancelEditTT}"/> 

Это решение обеспечило 1-шаг перенаправлять вместо 2-ступенчатой ​​старой.

0

Я не уверен, что это будет работать, но вы можете попробовать это:

Вместо:

<p:remoteCommand name="unlock_tt" actionListener="#{ttEntityMBean.unlock()}"/> 
<p:button value="#{msgs['button.ok']}" outcome="#{ttEntityMBean.navigationMenuItemToRedirect.navigationRule}" onclick="unlock_tt()"/> 

сделать:

<h:panelGroup> 
<f:ajax event="click" listener="#{ttEntityMBean.unlock}"/> 
<p:button value="#{msgs['button.ok']}" outcome="#{ttEntityMBean.navigationMenuItemToRedirect.navigationRule}" /> 
<h:panelGroup> 

Не забудьте удалить OnClick и ваш remotecommand.

Это должно обернуть панель группы вокруг вашей кнопки. PanelGroup реализует ClientBehaviorHolder, чтобы он мог получить тег f: ajax в своих дочерних элементах. Таким образом, когда вы нажимаете на него, он должен вызывать слушателя.

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