2016-07-15 5 views
0

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

+0

der beste Weg ist ein ‚Push‘ Mechanismus – Kukeltje

Antwort

0

Ich bin nicht sicher, wie Sie die Tabelle aktualisieren würde in einem anderen Register, ohne so etwas wie <p:poll> aber Ihren Tisch mit Ajax bearbeiten Sie so etwas wie tun: So effektiv Ihre Antwort

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

zB auf Basis von WebSockets zu verwenden, ist ein Duplikat http://stackoverflow.com/questions/3138488/how-to-use-ajax-mit-jsf-2-0?, aber Sie aktualisieren die Komponente auf der gleichen Seite, völlig nicht zu einem anderen Tab, so dass keine Beziehung zu der echten Frage ... – Kukeltje

+0

@Kukeltje Frage eins: Wie lade ich Tabelle mit Ajax. Ich erwähnte p: Umfrage für die andere Registerkarte. –

+0

Ja, aber deshalb habe ich erwähnt, dass Ihre Antwort identisch mit dem Link ist, den ich gepostet habe. Besser, den Benutzer zu diesem anderen Beitrag dann in einem Kommentar zu verweisen. – Kukeltje