2014-02-02 3 views
0

Когда я нажимаю кнопку New <p:commandButton actionListener="#{ecritureCtrl.newLine}" value="New" update="dataTableSaisiePiece" oncomplete="addRowOnComplete()" ajax="true"/>, новая строка добавляется в мою таблицу данных только при первом щелчке, а страница обновляется. Несколько клик, кроме первого, не обновляли dataTable. Поэтому, чтобы увидеть мои новые добавленные строки, я использую клавишу F5 для обновления моей страницы. Конечно, мой update="dataTableSaisiePiece" не работает или работает только в первом клике.Обновление данных с первичными даннымиТаблица с добавлением динамических добавок динамически

Вот моя страница home.xhtml:

<?xml version='1.0' encoding='UTF-8' ?> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:p="http://primefaces.org/ui"> 
    <script type="text/javascript"> 
      function addRowOnComplete() { 
     jQuery('#supercoolnewrow').trigger('click'); 
    } 
    </script> 
     <ui:composition template="/resources/template/all.xhtml"> 
      <ui:define name="titre">Saisie</ui:define> 

      <ui:define name="content"> 
       <p:tabView id="ViewPlan"> 

        <p:tab id="tab2" title="Saisie 1"> 
         <h:outputScript library="js" name="frenchLocale.js" /> 
           <h:form id="formPiece"> 
            <p:panel id="panelSaisie" header="Saisir" style="color: brown;font-size: 15px"> 
             <h:panelGrid columns="3" > 
               <p:outputLabel for="description" value="Description:" ></p:outputLabel> 
               <p:inputText id="description" value="#{ecritureCtrl.description}" required="true" label="Description" maxlength="100" size="75"> 
                 <f:validateLength maximum="100" /> 
                </p:inputText> 
                <p:message for="description" /> 

               <p:outputLabel for="date" value="Date:" ></p:outputLabel> 
               <p:calendar locale="fr" id="date" required="true" label="Date" value="#{ecritureCtrl.date}" /> 
               <p:message for="date" /> 

               <p:outputLabel for="code" value="Code Avant" ></p:outputLabel> 
               <p:inputText id="code" value="#{ecritureCtrl.code}" required="true" > 

               </p:inputText> 
               <p:message for="code" /> 

              </h:panelGrid> 
             <br/> 
             <p:dataTable var="line" value="#{ecritureCtrl.lignes}" id="dataTableSaisiePiece" > 

           <p:column headerText="First Name" style="width:150px"> 
            <p:inputText value="#{line.intituleCompte}" style="width:100%"/> 
           </p:column> 

           <p:column headerText="Last Name" style="width:150px"> 
            <p:inputText value="#{line.code}" style="width:100%"/> 

           </p:column> 

          </p:dataTable> 


          </p:panel> 
            <p:commandButton actionListener="#{ecritureCtrl.newLine}" value="New" update="dataTableSaisiePiece" oncomplete="addRowOnComplete()" ajax="true"/> 
            </h:form> 

          </p:tab> 

        <p:tab id="tab3" title="Saisie 2"> 
        </p:tab> 

       </p:tabView> 

      </ui:define> 
     </ui:composition> 

    </html> 

Мой ManagedBean:

@ManagedBean (name = "ecritureCtrl") 
    @SessionScoped 
    public class EcritureCtrl { 
    private List<Avant> lignes = new ArrayList<Avant>(); 
    Avant unUser; 

    private String description; 
    private Date date; 
    private String code; 
     public EcritureCtrl() { 
      lignes.add(new Avant()); 
     } 

     public void newLine(ActionEvent actionEvent){ 
      lignes.add(new Avant());    
     } 

    } 

Не могли бы вы мне помочь? Спасибо заранее.

+0

Как авангард равных и методы Hashcode? – Leo

+0

Есть ли у avant конвертер? – Leo

+0

@Leo У меня нет методов equs и hashcode. Я не использую ни конвертер. Нужно ли мне ? –

ответ

1

это, кажется, работает для меня

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

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.event.ActionEvent; 

@ManagedBean 
@SessionScoped 
public class EcritureCtrl implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private String    code; 
    private Date    date; 

    private String    description; 
    private List<Avant>   lignes    = new ArrayList<Avant>(); 
    private Avant    unUser; 

    public String getCode() { 
     return this.code; 
    } 

    public Date getDate() { 
     return this.date; 
    } 

    public String getDescription() { 
     return this.description; 
    } 

    public List<Avant> getLignes() { 
     return this.lignes; 
    } 

    public Avant getUnUser() { 
     return this.unUser; 
    } 

    @PostConstruct 
    private void init(){ 
     this.lignes.add(new Avant()); 
    } 

    public void newLine(ActionEvent actionEvent) { 
     this.lignes.add(new Avant()); 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public void setLignes(List<Avant> lignes) { 
     this.lignes = lignes; 
    } 

    public void setUnUser(Avant unUser) { 
     this.unUser = unUser; 
    } 

} 

и

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>Sorry</title> 
</h:head> 
<h:body> 
<script type="text/javascript"> 
function addRowOnComplete() { 
    alert(); 
} 
</script> 
    <h:form id="formPiece"> 

     <p:messages id="messages" showDetail="true" autoUpdate="true" 
      closable="true" /> 

     <p:tabView id="ViewPlan"> 

      <p:tab id="tab2" title="Saisie 1"> 
       <p:panel id="panelSaisie" header="Saisir" 
        style="color: brown;font-size: 15px"> 
        <h:panelGrid columns="3"> 
         <p:outputLabel for="description" value="Description:"></p:outputLabel> 
         <p:inputText id="description" value="#{ecritureCtrl.description}" 
          required="true" label="Description" maxlength="100" size="75"> 
          <f:validateLength maximum="100" /> 
         </p:inputText> 
         <p:message for="description" /> 

         <p:outputLabel for="date" value="Date:"></p:outputLabel> 
         <p:calendar locale="fr" id="date" required="true" label="Date" 
          value="#{ecritureCtrl.date}" /> 
         <p:message for="date" /> 

         <p:outputLabel for="code" value="Code Avant"></p:outputLabel> 
         <p:inputText id="code" value="#{ecritureCtrl.code}" 
          required="true"> 

         </p:inputText> 
         <p:message for="code" /> 

        </h:panelGrid> 
        <br /> 
        <p:dataTable var="line" value="#{ecritureCtrl.lignes}" 
         id="dataTableSaisiePiece"> 

         <p:column headerText="First Name" style="width:150px"> 
          <p:inputText value="#{line.intituleCompte}" style="width:100%" /> 
         </p:column> 

         <p:column headerText="Last Name" style="width:150px"> 
          <p:inputText value="#{line.code}" style="width:100%" /> 
         </p:column> 

        </p:dataTable> 


       </p:panel> 
       <p:commandButton actionListener="#{ecritureCtrl.newLine}" 
        value="New" update="dataTableSaisiePiece" oncomplete="addRowOnComplete()" 
        ajax="true" /> 

      </p:tab> 

      <p:tab id="tab3" title="Saisie 2"> 
      </p:tab> 

     </p:tabView> 
    </h:form> 

</h:body> 
</html> 
+0

подумайте об использовании ViewScoped вместо этого – Leo

+0

Perfect Leo It works. Это именно то, чего я хотел. Я удалил функцию Javascript 'addRowOnComplete()', которая не была полезной. Я не понял ваш комментарий: > рассмотрите также использование ViewScoped слишком Можете ли вы объяснить это? –

+0

Иногда область сеанса может быть слишком широкой. Страницы, использующие область сеанса, сохраняются в течение всего сеанса пользователя, и если этот пользователь перемещается по вашему приложению, он будет хранить все больше и больше данных в сеансе, и это может быть проблемой, если вы намерены одновременно обслуживать многих пользователей из-за ограничений памяти. Вот почему для страниц, которые просто должны поддерживать контекст для взаимодействия с одной и той же страницей, вы можете использовать область просмотра, которая будет жить только до тех пор, пока вы не покинете эту страницу. – Leo

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