Ich habe eine einfache Webapp, die es dem Benutzer erlaubt, Transaktionen zu erstellen, und auf einer anderen Seite kann der Benutzer alle vergangenen Transaktionen sehen. Ich mag:JSF Primefaces: Aktualisieren Sie eine DataTable in einem anderen Tab öffnen?
- die Datatable up-to-date sein haben, wenn ich die letzte Transaktion Seite
- öffne Um die Datatable zu aktualisieren, wenn ich eine Transaktion auf der Seite zur Erstellung
I erstellen Ich bin nicht sicher, ob dies durch ein oder zwei Funktionalitäten abgedeckt werden kann. Außerdem bin ich nicht sicher, wie man die Funktionalitäten entkoppelt. Sollte die Erstellung einer Transaktion die Aktualisierung der dataTable auslösen oder sollte die dataTable selbst neue Einträge in der DB finden?
Die letzten Transaktionen Seite:
Mein 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>();
}
}
Meine Transaktion Ansicht
<!-- 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>
Mein TransactionList-Controller
@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();
}
}
}
Die Schaffung Seite
Es gibt eine einfache textInputField mit einem Knopf (an ein Modell gebunden ist):
<h:commandButton id="sendtx" value="Send" styleClass="ui-priority-primary">
<f:actionListener binding="#{transactionXmlController.sendTx()}" />
</h:commandButton>
Die aufgerufene Methode:
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);
}
Bis jetzt funktioniert das.
Meine Fragen
Wie lade ich die Datatable mit AJAX?
Ich möchte die DataTable aktualisieren, auch wenn es in einer anderen Registerkarte vor dem Erstellen einer neuen Transaktion geöffnet wurde. Wie macht man das ?
Wie kann ich meine ersetzen? „F: Event type =“ preRenderView“mit einem viewaction, um die Datatable zu füllen, bevor die Seite Rendering
der beste Weg ist ein ‚Push‘ Mechanismus – Kukeltje