PrimeFaces对话显示错误的信息

时间:2012-08-02 13:11:37

标签: jsf drop-down-menu primefaces datatable javabeans

我有一个包含2个下拉列表的页面,用于填充数据表(取决于下拉列表中的选择)。数据表包含用于选择多行的复选框,然后打开一个对话框,根据所选行显示信息。问题是:我第一次点击按钮打开对话框时它是空的,当我更改下拉列表的内容并打开对话框时,它将显示上一个选择的信息,而不是我刚制作的那个和它的信息。保持这种状态直到我更改下拉列表等等...对话框总是在更改下拉列表中的选项之前显示上一个选择的信息。

页面:

        <h:form id="form">
    <f:view>

    <p:growl id="msgs" showDetail="true" />
    <p:layout style="min-width:300px;min-height:200px;" id="layout">
        <p:layoutUnit position="west" resizable="true" size="200" minSize="40" maxSize="300">
        <!-- _______________________________________start drop down________________________________________________________ -->
            <h:panelGrid columns="1" cellpadding="5">

                <p:selectOneMenu id="Item" value="#{ThemeBean.idItem}">
                    <f:selectItem itemLabel="Select un Item " itemValue="" />
                    <f:selectItems value="#{ItemBean.listItemsUser}" var="utilisateur" />
                    <p:ajax listener="#{ThemeBean.handleCityChange}" update="suburbs" />
                </p:selectOneMenu>

                <p:selectOneMenu id="suburbs" value="#{ReponseBean.idTheme}">
                    <f:selectItem itemLabel="Select un Theme" itemValue="" />
                    <f:selectItems value="#{ThemeBean.suburbs}" />
                    <p:ajax listener="#{ReponseBean.handleCityChange_Ecart}" update=":form:dropArea" />
                </p:selectOneMenu>

            </h:panelGrid>
            <p:separator />
        </p:layoutUnit>
    <!-- _______________________________________end drop down________________________________________________________ -->
        <p:layoutUnit position="center">

            <p:outputPanel id="dropArea">
                <p:dataTable id="dt1" var="car"
                    value="#{ReponseBean.listPartheme_ecart}"
                    rendered="#{not empty ReponseBean.listPartheme_ecart}"
                    rowKey="#{car.id}" editable="true"
                    selection="#{EcartBean.selectedCars}">

                    <p:column selectionMode="multiple" style="width:18px" />
                    <p:column headerText="Questions">
                        <h:outputText value="#{car.q1.text}" />
                    </p:column>

                    <p:column headerText="Reponse">
                        <h:outputText value="#{car.rep}" />
                    </p:column>
                    <f:facet name="footer">
                        <p:commandButton id="multiViewButton" value="Ajouter Ecart" icon="ui-icon-search"
                            update=":form:multiDialog :form:displayMulti" oncomplete="multiCarDialog.show()"/>
                    </f:facet>
                </p:dataTable>
                <!-- ________________________________________dialogue________________________________________________ -->
                <p:dialog id="multiDialog" header="Ajout Ecart" widgetVar="multiCarDialog" height="300" showEffect="fade">
                    <p:dataList id="displayMulti" value="#{EcartBean.selectedCars}" var="selectedCare">
                        #{selectedCare.q1.text} (#{selectedCare.rep})
                    </p:dataList>
                    <p:messages />
                    <h:panelGrid columns="3" cellpadding="5">

                        <h:outputLabel value="Niveau Ecart" />

                        <p:selectOneMenu id="idUtilisateur" value="#{EcartBean.idNiveauAudit}">
                            <f:selectItems value="#{NiveauEcartBean.listNiveauSelect}"  var="nivecart" />
                        </p:selectOneMenu>
                        <p:message for="idUtilisateur" />
                        <h:outputLabel value="Constatation" id="Constatation" />
                        <h:inputText value="#{EcartBean.consta}" />
                        <p:message for="Constatation" />
                        <p:commandButton icon="ui-icon-disk" value="Ajouter" id="ViewButton" action="#{EcartBean.save}"
                            oncomplete="multiCarDialog.hide();">
                        </p:commandButton>
                    </h:panelGrid>

                </p:dialog>

            </p:outputPanel>

        </p:layoutUnit>
    </p:layout>

    </f:view>
    </h:form>

方法ThemeBean.handleCityChange:

    public void handleCityChange() {

    qu = respQue.lister_Ques(idItem);

    if (qu != null) {
        List<SelectItem> listuti = new ArrayList<SelectItem>();
        List<Theme> list = resp.lister_Par_Thme(qu.getId());
        for (Theme p : list) {
            listuti.add(new SelectItem(p.getId(), p.getLibelle()));
        }
        this.setSuburbs(listuti);

    } else {
        System.out.println("erreur");
    }

}

ReponseBean.handleCityChange_Ecart:

    public void handleCityChange_Ecart() {

    listPartheme_ecart= new ArrayList<Reponse>();
    System.out.println("taiile avant "+listPartheme_ecart.size());
    List<Reponse> lr = respQ.findByTheme_ecart(idTheme);
    System.out.println(idTheme);
    for (int i = 0; i < lr.size(); i++) {
        if (lr.get(i).getAudit().getId() == aud.getId())
            listPartheme_ecart.add(lr.get(i));
    }

}

我应该提一下,在控制台中,当我打开对话框时,我看到了写信息,它只是没有在对话框上显示出来。 谢谢你的时间和帮助。

我正在更新这篇文章,说我最终解决了填充弹出窗口的问题 我把对话放在一个新的形式:

        </h:form>
    <!-- ________________________________________dialogue________________________________________________ -->
    <h:form id="hh" >
    <p:dialog id="multiDialog" header="Ajout Ecart" widgetVar="multiCarDialog" height="300" showEffect="fade">

        <p:dataList id="displayMulti" value="#{EcartBean.selectedCars}" var="selectedCare">
            #{selectedCare.q1.text} (#{selectedCare.rep})
        </p:dataList>
        <p:messages />

            <h:panelGrid columns="3" cellpadding="5">

                <h:outputLabel value="Niveau Ecart" />
                <p:selectOneMenu id="idUtilisateur" value="#{EcartBean.idNiveauAudit}">
                    <f:selectItems value="#{NiveauEcartBean.listNiveauSelect}"  var="nivecart" />
                </p:selectOneMenu>

                <p:message for="idUtilisateur" />
                <h:outputLabel value="Constatation" id="Constatation" />

                <h:inputText value="#{EcartBean.consta}" />
                <p:message for="Constatation" />

                <p:commandButton  icon="ui-icon-disk" value="Ajouter" action="#{EcartBean.save}"  id="ViewButton" oncomplete="multiCarDialog.hide();" />

            </h:panelGrid>

        </p:dialog>
    </h:form>

我现在有一个小问题:对话中的commandButton没有触发我尝试过的方法

<p:commandButton  icon="ui-icon-disk" value="Ajouter" action="#{EcartBean.save}"  id="ViewButton" oncomplete="multiCarDialog.hide();" />

<p:commandButton  icon="ui-icon-disk" value="Ajouter" actionListener="#{EcartBean.save}"  id="ViewButton" oncomplete="multiCarDialog.hide();" />

<p:commandButton  icon="ui-icon-disk" value="Ajouter" id="ViewButton" oncomplete="multiCarDialog.hide();" >
                <f:actionListener  binding="#{EcartBean.save}"/>
                </p:commandButton>

但没有:(。哪里出了问题?

1 个答案:

答案 0 :(得分:-1)

根据<p:ajax>的文档,listener仅在部分请求时触发,我在您粘贴的代码中看不到这种情况。使用event="valueChange"触发部分请求,这将导致当前更新显示在对​​话框中。

<p:ajax event="valueChange" listener="#{ThemeBean.handleCityChange}" update="suburbs" /> 

<p:ajax event="valueChange" listener="#{ReponseBean.handleCityChange_Ecart}" update=":form:dropArea" />