JSF Primefaces:在另一个标签中更新dataTable?

时间:2016-07-15 12:49:07

标签: jsf-2.2

我有一个简单的webapp,允许用户创建交易,在另一个页面上,用户可以看到所有过去的交易。我想:

  • 当我打开过去的交易页面时,让dataTable保持最新状态
  • 在创建页面上创建交易时更新dataTable

我不确定这是否可以由一个或两个功能涵盖。另外,我不确定如何解耦功能。是否应该创建事务触发dataTable的刷新,或者 dataTable本身是否应该在数据库中找到新条目?

过去的交易页面:

我的TransactionListModel

package model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

import entity.Transaction;

@Named
@SessionScoped
public class TransactionListModel implements Serializable {
    private static final long serialVersionUID = 1L;

    private List<Transaction> txList;

    @PostConstruct
    public void init() {
        txList = new ArrayList<Transaction>();
    }

    public List<Transaction> getTxList() {
        return txList;
    }

    public void clearList(){
        txList = new ArrayList<Transaction>();
    }
}

我的交易视图

<!-- Fill the table before rendering -->
<f:event type="preRenderView" listener="# {transactionListController.findAllTx()}" />

<h:form id="alltxform">
    <p:dataTable id="tableAllTransactions" var="transaction"
                value="#{transactionListModel.txList}">
        <f:facet name="header">Transactions</f:facet>
            <p:column headerText="Id">
            <h:outputText value="#{transaction.id}" />
        </p:column>
    </p:dataTable>
</h:form> 

我的TransactionList控制器

@Named
@RequestScoped
public class TransactionListController implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private Logger log;

    @Inject
    private TransactionService txService;

    @Inject
    private TransactionListModel txListModel;

    public void findAllTx() {
        txListModel.clearList();
        txListModel.getTxList().addAll(txService.findAllTx());
    }

    public void reset() {
        if (txListModel.getTxList() != null) {
            txListModel.clearList();
        }
    }
}

创建页面

有一个简单的textInputField(绑定到模型),带有一个按钮:

<h:commandButton id="sendtx" value="Send" styleClass="ui-priority-primary">
    <f:actionListener binding="#{transactionXmlController.sendTx()}" />
</h:commandButton>

被叫方法:

public void sendTx() {

        FacesMessage message;
        if (!transactionService.sendTx(transactionXmlEditableModel.getXml()).equals("OK"))
            message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "KO");
        else {
            message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Success", "OK");

        }    
        fc.addMessage(null, message);
    }

到目前为止,这都有效。

我的问题

  • 如何使用AJAX重新加载dataTable?

  • 我希望dataTable更新,即使它在创建新事务之前已在另一个选项卡中打开。怎么做?

  • 如何使用viewAction替换我的“f:event type =”preRenderView“,以便在呈现页面之前填充dataTable?

1 个答案:

答案 0 :(得分:0)

我不确定如何在没有类似<p:poll>的情况下更新另一个标签中的表,但是要使用Ajax更新您的表,您可以执行以下操作:

<h:commandButton id="sendtx" value="Send" styleClass="ui-priority-primary">
    <f:ajax listener = '#{transactionXmlController.sendTx()}' render="alltxform:tableAllTransactions" />
</h:commandButton>