2014-11-14 3 views
0

Я новичок в JSF и в других местах. Я использую Primefaces Framework, чтобы получить модальные условия соглашения об обслуживании. Проблема, с которой я сталкиваюсь, заключается в том, что мой обработчик события dialogReturn не вызывается, когда диалог закрывается, а модальное наложение остается на странице, хотя сам диалог закрывается. Модальным наложением может быть красная селедка, потому что метод dialogReturn не вызывается, когда диалог также не является модальным.Primefaces Диалог диалогового окна Диалоговое окно обработчика событий, не вызываемого

Вот соответствующие фрагменты кода:

Форма, из которого создается диалоговое окно:

<h:form prependId="false"> 
<ul> 
    <ui:repeat value="#{serviceEditor.service.subsystems}" var="ss"> 
    <li> 
    <em>#{ss.name}</em> - #{ss.description}<br/> 
    <ui:fragment rendered="#{identity.loggedIn}"> 
     <ui:fragment rendered="#{grantManager.hasAccess(ss)}"> 
          (You have access to this dataset.) 
      <h:commandButton value="Discontinue Access" action="#{grantManager.unrequestAccess(ss)}"/> 
     </ui:fragment> 
     <ui:fragment rendered="#{!grantManager.hasAccess(ss)}"> 
      <p:commandButton value="Request Access" 
         actionListener="#{serviceDialog.display(ss)}" 
         styleClass="btn btn-primary" > 
       <p:ajax event="dialogReturn" 
         listener="#{serviceEditor.acceptDialogHandler}" /> 
      </p:commandButton> 
      </ui:fragment> 
... 

ServiceEditor помечается @Named @Stateful @ConversationScoped

Код ActionListener для Диалоговое окно:

public void display (ServiceSubsystem sub) 
    { 
    if (sub == null) 
    { 
     log.error("Service Accept dialog attempt with null subservice. Lose."); 
     FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Subservice Unavailable", "We seem to have misplaced that service. This has been logged for investigation."); 
     RequestContext.getCurrentInstance().showMessageInDialog(message); 
     return; 
    } 
    log.info("svcDlg: Displaying accept dialog for service: {}.{}", sub.getService().getName(), sub.getName()); 
    this.sub = sub; 
    Map<String, Object> dlgOpts = new HashMap<>(2); 
    dlgOpts.put("modal", true); 
    RequestContext.getCurrentInstance().openDialog("serviceAcceptDialog", dlgOpts, null); 
    log.info("svcDlg: Did that accept dialog work out?"); 
    } 

ДействиеLis Tener код кнопки принимать команды в диалоге:

public void accept() 
    { 
    log.info("Accepted {}.{}", sub.getService().getName(), sub.getName()); 
... 
    String destination = "/service?faces-redirect=true&uuid=" + sub.getService().getUuid(); 
    log.info("Sending user to: {}", destination); 
    RequestContext.getCurrentInstance().closeDialog(destination); 
    } 

И, наконец, в диалоговом возвратного слушателя, который не вызывается:

public void acceptDialogHandler (SelectEvent event) 
    { 
    String dest = (String) event.getObject(); 
    log.info("Service accept dialog closed. sending here: ", dest); 
    ((ConfigurableNavigationHandler) FacesContext.getCurrentInstance().getApplication().getNavigationHandler()) 
      .performNavigation(dest); 
    } 

Что я пропустил в документации? Или это ошибка?

ответ

0

Думаю, вы можете попробовать использовать primefaces dialog component, проще.

Чтобы показать или закрыть диалоговое окно, вам нужно всего лишь вызвать его:

PF('widgetVarDialogName').hide(); 
PF('widgetVarDialogName').show(); 

Вы можете открыть или закрыть его в поле зрения действия, например:

<p:commandButton 
    value="Open dialog" 
    type="button" 
    onclick="PF('widgetVarDialogName').show()" /> 

<p:commandButton 
    value="Do Action" 
    action="#{myBean.myAction()}" 
    oncomplete="PF('widgetVarDialogName').hide();" /> 

Кроме того, вы можете вызвать его из боба, если хотите.

RequestContext.getCurrentInstance().execute("PF('widgetVarDialogName').show()"); 
RequestContext.getCurrentInstance().execute("PF('widgetVarDialogName').hide()"); 

(Помните, что диалог должен быть помещен внутри формы)

+0

Спасибо за предложение. На этой основе работает версия. У меня все еще есть горячее интеллектуальное желание узнать, почему структура не работает. –

0

Я вижу, вы много работаете с атрибутом rendered="...". Из того, что я испытал, <p:ajax event="dialogReturn" /> не запускается, если сам или родительский элемент не отображается.

Так что посмотрите на ваш метод public void accept(). Если вы измените какое-либо состояние так, чтобы обработанное attirbute родительского элемента <p:ajax event="dialogReturn" />, а именно rendered="#{!grantManager.hasAccess(ss)}" и/или rendered="#{identity.loggedIn}", оценивалось до false, тогда слушатель не был бы выполнен.


EDIT

Обходной просто пришла мне в голову. Можно избежать проблемы с тем же обходным решением, как если бы вы хотели создать диалоговое окно с <p:menuitem /> (Primefaces Dialog Framework — dialogReturn event from menuitem).

Просто создайте отдельную кнопку где-нибудь за пределами, возможно, не отображаемой области, и активируйте ее с помощью javascript.

Не тестировался пример кода:

<ui:fragment 
    id="fragment" 
    rendered="#{...}"> 
    <h:commandButton 
     id="pseudo_button" 
     value="..." 
     onclick="document.getElementById('real_button').click()" /> 
</ui:fragment> 

<h:commandButton 
    id="real_button" 
    action="#{bean.realWorkHere()}" 
    update="fragment" 
    style="display:none;"> 
    <p:ajax 
     event="dialogReturn" 
     listener="#{...}" /> 
</h:commandButton> 
Смежные вопросы