Primefaces - 未显示对话框需要输入

时间:2015-04-13 21:04:51

标签: jsf-2 primefaces

我尝试使用"登录功能"开发一个简单的网络应用程序。为此,我创建了一个带有primefaces的对话框。 如果我点击登录,对话框打开,我可以登录并注销。但是如果我更改了网站,那么我就无法注销,因为对话框需要我输入必填字段

我在Glassfisch 4.0上运行Primefaces 5.2

这是一个完整的war文件,其中包含显示问题的所有代码。 (登录凭据为user:admin | password:admin) issueShowCase.war

的template.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <ui:insert name="head" />
</h:head>
<h:body>
    <h:form id="mainForm">
        <p:growl id="messages" showDetail="true" showSummary="false"/>
        <h:messages />
        <p:menubar>
            <p:submenu label="Sites" icon="ui-icon-document">
                <p:menuitem value="Recipes" outcome="page1.xhtml"/>
                <p:separator />
                <p:menuitem value="Categories" outcome="page2.xhtml"/>
            </p:submenu>
            <f:facet name="options">
                <h:panelGroup id="loginLogout">
                    <p:commandButton rendered="#{not empty user}" value="Logout" title="Logout #{user}" icon="ui-icon-extlink" actionListener="#{loginController.logout}" update="loginLogout messages content" />
                    <p:commandButton rendered="#{empty user}" value="Login" icon="ui-icon-extlink" onclick="PF('loginDlg').show();" />
                </h:panelGroup>
            </f:facet>
        </p:menubar>
        <h:panelGroup id="content">
            <ui:insert name="content"></ui:insert>
            <ui:insert name="body"></ui:insert>
        </h:panelGroup>
        <p:dialog header="#{i18n['title.login']}" widgetVar="loginDlg" modal="true">
            <h:panelGrid columns="2" cellpadding="5">
                <h:outputLabel for="username" value="Username:" />
                <p:inputText id="username" value="#{loginController.userName}" required="true" label="username" />
                <h:outputLabel for="password" value="Password:" />
                <p:password id="password" value="#{loginController.password}" required="true" label="password" />
                <f:facet name="footer">
                    <p:commandButton value="Login" update="loginLogout messages content" actionListener="#{loginController.login}" oncomplete="handleLoginRequest(xhr, status, args)" />
                </f:facet>
            </h:panelGrid>
        </p:dialog>
    </h:form>
    <script type="text/javascript">
        function handleLoginRequest(xhr, status, args) {
            if (args.validationFailed || !args.loggedIn) {
                PF('loginDlg').jq.effect("shake", {
                    times : 3
                }, 500);
            } else {
                PF('loginDlg').hide();
            }
        }
    </script>
</h:body>
</html>

2 个答案:

答案 0 :(得分:1)

感谢Kukeltje的帮助。考虑到我现在需要在每个按钮上使用process-attribute的问题,我找到了解决方案。

我将对话框放在一个自己的表单标签中,现在它就像一个魅力。

    <h:panelGroup id="content">
        <ui:insert name="content"></ui:insert>
        <ui:insert name="body"></ui:insert>
    </h:panelGroup>
</h:form>
<h:form id="dlgForm">
    <p:dialog header="#{i18n['title.login']}" widgetVar="loginDlg" modal="true">
        <h:panelGrid columns="2" cellpadding="5">
            <h:outputLabel for="username" value="Username:" />
            <p:inputText id="username" value="#{loginController.userName}" required="true" label="username" />
            <h:outputLabel for="password" value="Password:" />
            <p:password id="password" value="#{loginController.password}" required="true" label="password" />
            <f:facet name="footer">
                <p:commandButton  value="Login" update=":mainForm:loginLogout :mainForm:messages :mainForm:content" actionListener="#{loginController.login}" oncomplete="handleLoginRequest(xhr, status, args)" />
            </f:facet>
        </h:panelGrid>
    </p:dialog>
</h:form>

答案 1 :(得分:0)

在注销按钮上添加process属性以仅处理命令按钮,因此请为其指定值'@this'

<p:commandButton process="@this" rendered="#{not empty user}" value="Logout" title="Logout #{user}" icon="ui-icon-extlink" actionListener="#{loginController.logout}" update="loginLogout messages content" />