【问题标题】:Datatable is not updated after adding records添加记录后数据表未更新
【发布时间】:2013-11-27 10:19:19
【问题描述】:

我有一个init() 函数,它返回将显示在 Primefaces 数据表中的电子邮件列表。我有一个commandButton,它可以提取电子邮件并将它们保存在dataTable 中。仅当我注销并登录时,这些新记录才会显示在 dataTable 中。 这是我的 init() 函数(我的托管 Bean 用 @ManagedBean(name = "mailMB")@SessionScoped 注释):

@PostConstruct
    public void init() {
        emails = new ArrayList();      
        idCustomer = (String) session.getAttribute("idCustomer");
        System.out.println(idCustomer + " this is it");
        cust = customerBusinessLocal.findById(idCustomer);
        System.out.println(cust.getName());
        datas = dataBusinessLocal.findByCustomer(cust);
        System.out.println(datas.size());
        for (Data d : datas) {
            for (Email e : mailBusinessLocal.mailsByData(d)) {
                emails.add(e);
            }
        }

    public List<Email> getEmails() {     
        return emails;
    }

在我的页面 xhtml 中,我实现了以下代码:

<h:form id="form">  
        <p:commandButton value="Extract" update="tableemails" id="ajax"  widgetVar="extractButton"
                action="#{mailMB.searchEmails()}" 
                icon="ui-icon-disk" styleClass="ui-priority-primary"
                onstart="blockUIWidget1.block()"
                oncomplete="blockUIWidget1.unblock()"/>  

        <pe:blockUI target="formulaire"  widgetVar="blockUIWidget1">  
            <h:panelGrid columns="2"> 
                <img src="../../pictures/animated-loading-bar.gif" width="264" height="34" alt="animated-loading-bar"/>
                <h:outputText value="Please wait..." style="white-space: nowrap;"/>  
            </h:panelGrid>  
        </pe:blockUI>
        <p:panel id="display" header="Emails" >  
            <p:dataTable  id="tableemails" value="#{mailMB.emails}"  var="item" rowsPerPageTemplate="5,10,15" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
                        paginator="true" rows="10" styleClass="case-table"  emptyMessage="No records found with given criteria" paginatorPosition="bottom" 
                        filteredValue="#{mailMB.filteredMails}" rowKey="#{item.id}" 
                        selection="#{mailMB.selectedMail}" selectionMode="single" >
                <p:ajax event="rowSelect" update=":form:display"/>            
                <p:column styleClass="blockable" filterStyle="width: 250px" filterBy="#{item.email} " sortBy="#{item.email}">
                    <f:facet name="header">
                        <h:outputText value="Email"/>
                    </f:facet>
                    <h:outputText value="#{item.email}"/>
                </p:column>
            </p:dataTable>
        </p:panel>                     
</h:form>  

【问题讨论】:

    标签: jsf primefaces datatable


    【解决方案1】:

    您在保留一些新数据后似乎没有重新加载您的List&lt;Email&gt; emails@PostConstract 在创建 bean 后执行一次(因为它是 @SessionScoped,它在每个会话中创建一次),这就是为什么您仅在再次登录后才能看到更改的原因。添加一个方法repopulateEmails(),它会从数据库中加载数据并在您添加/删除某些内容后运行它,只需将其添加到您的persist() 方法中即可。

    public void persist()
    {
        ....
        getEntityManager().persist(getInstance());
        getEntityManager().flush();
        emails = null;
        ......
    
    }
    
    public List<Email> getEmails(){
        if(emails == null){
           emails = repopulateEmails();
        }
        return emails;
    }
    

    【讨论】:

    • 我不知道如何在持久化后重新加载电子邮件列表
    • 加载它们的方式与在 init() 方法中加载它们的方式相同。
    • 当我在 getEmails() 方法而不是 init() 中加载它们时,dataTable 中的行被重复了几次,但仍然没有更新 dataTable
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多