Primefaces的p:带窗体的对话框的行为不符合预期

时间:2014-08-03 18:03:42

标签: jsf jsf-2 primefaces

我使用netbeans从JPA实体开始生成基于Primefaces的CRUD网站,在调整更新对话框以满足我的需求后,我遇到了一些问题。域模型非常简单:我有一个包含多个Guest的实体邀请。

@Entity
public class Invitation implements Serializable {
...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "invitationId")
    private List<Guest> guestList;
    public List<Guest> getGuestList() {
        return guestList;
    }
...
}

我有一个概述页面(list.xhtml),其中列出了所有邀请,用户可以选择一个进行编辑。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui" template="/template/layout.xhtml">
    <ui:define name="content">
        <h:form id="InvitationListForm">
            <p:dataTable var="invitation" id="datalist"
                value="#{invitationController.invitations}" resizableColumns="true"
                selectionMode="single" selection="#{invitationController.selected}"
                rowKey="#{invitation.invitationId}" paginator="true" rows="10"
                rowsPerPageTemplate="10,30,50,100" draggableColumns="true">
                <p:ajax event="rowSelect" update="createButton editButton " />
                <p:ajax event="rowUnselect" update="createButton editButton " />

                <p:column headerText="Name">
                    <h:outputText id="invitationName" value="#{invitation.name}" />
                </p:column>
                ...

                <f:facet name="footer">
                        <p:commandButton id="createButton" icon="ui-icon-plus"
                            value="#{msgs.lbl_add_new}" update=":InvitationCreateForm"
                            oncomplete="PF('InvitationCreateDialog').show()" />

                        <p:commandButton id="editButton" icon="ui-icon-pencil"
                            value="#{msgs.lbl_edit}" update=":InvitationEditForm"
                            oncomplete="PF('InvitationEditDialog').show()"
                            disabled="#{empty invitationController.selected}" />
                </f:facet>
            </p:dataTable>
        </h:form>
        <ui:include src="create.xhtml" />
        <ui:include src="edit.xhtml" />
    </ui:define>
</ui:composition>

请注意,layout.xhtml不包含任何表单(没有嵌套表单)。 对话框edit.xhtml分为两部分:一部分用户可以输入邀请&#34; head&#34;信息和另一个带有数据表的信息,她可以编辑/添加/删除访客。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<body>
    <ui:composition>
        <h:form id="InvitationEditForm">
            <p:dialog id="InvitationEditDlg" widgetVar="InvitationEditDialog"
                modal="true" resizable="false" appendTo="@(body)"
                header="#{msgs.lbl_add_new}">

                <h:panelGroup id="display">
                    <p:panelGrid columns="2"
                        rendered="#{invitationController.selected != null}">
                        <p:outputLabel value="#{msgs.lbl_name}" for="name" />
                        <p:inputText id="name"
                            value="#{invitationController.selected.name}" required="true"/>
                ...
                </p:panelGrid>
                <p:dataTable var="aGuest" id="guestTable" style="width: 1200px;"
                        value="#{invitationController.selected.guestList}"
                        resizableColumns="false" rowIndexVar="idx" draggableColumns="true">
                        <p:column width="80" headerText="#{msgs.lbl_name}">
                            <p:inputText id="guestName" value="#{aGuest.name}" />
                        </p:column>
                        ...
                        <p:column width="20">
                            <p:commandButton
                                actionListener="#{invitationController.addNewGuest}"
                                id="addGuestButton" update="guestTable" icon="ui-icon-plusthick"
                                title="+" />
                            <p:commandButton
                                actionListener="#{invitationController.deleteGuest(idx)}"
                                id="deleteGuestButton" update="guestTable"
                                icon="ui-icon-minusthick" title="-" immediate="true"
                                rendered="#{invitationController.selected.guestList.size()>1}" />
                        </p:column>
                        </p:dataTable>

                    <p:commandButton actionListener="#{invitationController.save}"
                        value="#{msgs.lbl_save}"
                        update="display,:InvitationListForm:datalist,:growl"
                        oncomplete="handleSubmit(args,'InvitationEditDialog');" />
                    <p:commandButton value="#{msgs.lbl_cancel}" immediate="true"
                        actionListener="#{invitationController.cancel}"
                        onclick="PF('InvitationEditDialog').hide()" />
                </h:panelGroup>

            </p:dialog>
        </h:form>
    </ui:composition>
</body>
</html>

和控制器

@SessionScoped
@Named
public class InvitationController implements Serializable {
    private Invitation selected; //with getter and setter

}

现在,我认为我的问题应该是p:dialog和h:form的组合。

edit.xhtml的原始生成版本具有嵌套在对话框中的LeaveEditForm形式,而不像我上面发布的那样。问题是在点击editButton之后加载了对话框,但是dataTable总是被我在会话中选择的第一个邀请的访客填充(更奇怪的是,假设会话中的第一个邀请只有一个访客A:选择一个邀请2位客人B和CI获得A和B显示)。当控制器返回正确的guestList()时,我认为更新和反转形式存在问题并且显示解决了这个问题..

不幸的是,这并没有解决所有问题,因为现在addGuestButton和deleteGuestButton的actionListener不再被调用..

我真的很困惑:你可以帮我修改我的代码吗?提前谢谢!

0 个答案:

没有答案