2016-07-15 4 views
0

У меня есть простой webapp, который позволяет пользователю создавать транзакции, а на другой странице пользователь может видеть все прошлые транзакции. Я хотел бы:JSF Primefaces: обновить dataTable на другой вкладке?

  • Чтобы иметь DataTable быть уточненным, когда я открываю прошлое страницы транзакции
  • Чтобы обновить DataTable, когда я создаю транзакцию на странице создания

I я не уверен, что это может быть покрыто одной или двумя функциями. Кроме того, я не уверен, как отделить функциональность. Должно ли создание транзакции инициировать обновление данныхTable, или должен ли файл 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); 
    } 

Пока это работает.

Мои вопросы

  • Как перезагрузить DataTable с помощью AJAX?

  • Я бы хотел, чтобы dataTable обновлялся, даже если он был открыт на другой вкладке перед созданием новой транзакции. Как это сделать?

  • Как заменить мой? «F: тип события =» preRenderView»с viewAction для того, чтобы заполнить DataTable перед визуализацией страницы

+0

Лучший способ заключается в использовании механизма «проталкивания» на основе, например, на WebSockets – Kukeltje

ответ

0

Я не знаю, как вы бы обновить таблицу в другой вкладке, без чего-то вроде <p:poll>, но чтобы обновить таблицу с помощью Ajax вы можете сделать что-то вроде:

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

Так эффективно ваш ответ является дубликатом http://stackoverflow.com/questions/3138488/как к потребительной Ajax-с-Jsf-2-0?, но вы обновляете компонент на той же странице, полностью не связанный с какой-либо другой вкладкой, поэтому никакого отношения к реальному вопросу ... – Kukeltje

+0

@Kukeltje вопрос один: как перезагрузить таблицу с помощью ajax. Я упомянул p: poll для другой вкладки. –

+0

Да, но именно поэтому я упомянул, что ваш ответ идентичен ссылке, которую я опубликовал. Лучше отправить пользователя на этот другой пост, а затем в комментарий. – Kukeltje

Смежные вопросы