用ajax的primefaces更新对话框?

时间:2014-09-02 18:53:32

标签: jsf primefaces managed-bean

我有2个对话框。对话框(列表)和对话框(创建)。在对话框列表中,我有一个<p:dataTable/>,其中包含插入Dialog(create)的值。 对话框列表,打开Dialog创建以插入值。

我想要的是在对话框(创建)中的插入值自动对话框(列表)刷新并插入值。

正在寻找解决方案,我发现任何使用update的{​​{1}}和ajax的primefaces的建议。我正在尝试这个但仍然没有成功。

在对话框(创建)中插入值后,如何更新对话框(列表)?

这是我的尝试方式。

对话(列表)

<p:commandButton/>

对话(创建)

<p:dialog header="Turmas" id="TurmaViewDlg" widgetVar="TurmaViewDialog" appendTo="@(body)" modal="true" resizable="false" draggable="false">
    <h:form id="TurmaListForm">
        <p:panel id="display">
            <p:dataTable id="datalist" value="#{turmaMB.turmas}" var="turma" 
                                    paginator="true" 
                                    rows="5" 
                                    rowsPerPageTemplate="5,10,20,30,40,50"
                                    selectionMode="single"
                                    selection="#{turmaMB.bean}"
                                    rowKey="#{turma.id}"                        
                                    liveScroll="true"
                                    > 
                    <p:column headerText="#">
                            <h:outputText value="#{turma.id}"/>         
                    </p:column> 
                    <p:column headerText="Turma">
                            <h:outputText value="#{turma.turma}"/>
                    </p:column>
                    <p:column headerText="Ano">
                            <h:outputText value="#{turma.ano}" />
                    </p:column> 
            </p:dataTable>
            <p:commandButton id="createButton" icon="ui-icon-plus" value="Novo" update=":TurmaCreateForm" oncomplete="PF('TurmaCreateDialog').show()"/>
        </p:panel>
    </h:form>  

    <ui:include src="create.xhtml"/>
</p:dialog>

托管bean

<p:dialog header="Cadastro de turma" id="TurmaCreateDlg" widgetVar="TurmaCreateDialog" appendTo="@(body)" modal="true" resizable="false" draggable="false">

    <h:form id="TurmaCreateForm">
        <p:growl id="growl" life="3000"/>
        <p:panelGrid columns="2" id="display">
            <f:validateBean>            
                <p:outputLabel value="Turma"/>
                    <p:inputText value="#{turmaMB.bean.turma}"                             
                             maxlength="50"
                             id="turmaId"
                             >                     
                </p:inputText>                

                <p:outputLabel value="Ano"/>
                    <p:inputText value="#{turmaMB.bean.ano}"                            
                             maxlength="4"
                             id="anoId"
                             >                         
                    </p:inputText>   
            </f:validateBean>                           
        </p:panelGrid>

        <p:panel>
            <p:commandButton value="Salvar" action="#{turmaMB.insert(turmaMB.bean)}" update="display,:TurmaListForm:datalist,growl">            
                <f:ajax execute="@form" render="@form"/>
            </p:commandButton>            
            <p:commandButton value="Cancelar" onclick="TurmaCreateDialog.hide()"/>
        </p:panel>


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

1 个答案:

答案 0 :(得分:1)

您的代码很好,Ajax似乎不是问题。问题源于您的turmas List,它填充一次:第一次访问turma时。

所以你有两个选择。

  • 使用turmas=null清除turmas列表,因此强制dao在第一次调用getTurmas()时重新加载所有内容。
  • 将新的turma实体添加到turmas列表中。

当然第一个选择是在数据库上产生更多流量。第二个选项是备用数据库,但你有一些旧数据的副本。

所以基本上任何这些解决方案都可以解决您的问题:

选项1:

public void insert(Turma t){      
   dao.insert(t);
   turmas = null;
   bean = new Turma();
}

选项2:

public void insert(Turma t){      
   dao.insert(t);
   turmas.add(t);
   bean = new Turma();
}