2016-05-08 4 views
4

J'ai trouvé un problème lors de l'utilisation de bootsfaces inputText avec ajax. J'utilise JSF 2.2, Bootsfaces 0.8.1 et Primefaces 5.3.Bootsfaces inputText perd le focus causé par l'utilisation d'ajax et la mise à jour de la valeur dans le bean

J'essaie d'entrer une valeur de date dans le champ inputText. Dès que j'entre la dernière valeur de la date, inputText doit déclencher l'événement change. À ce stade, je voudrais utiliser ajax pour appeler une méthode de bean. Le problème est que mon champ perd son focus dès que j'essaie d'entrer la dernière valeur et que la méthode n'a jamais été invoquée.

J'ai donc essayé un peu avec Primefaces et ça marche presque comme je le voulais. À ce stade j'ai eu différentes questions:

  1. Pourquoi mon champ inputText perd-il le focus en entrant la dernière valeur? (Bootsfaces)
  2. Pourquoi la méthode du bean n'est-elle jamais appelée après avoir perdu le focus? (Bootsfaces)
  3. Est-il possible d'invoquer la méthode du bean après que la valeur du bean ait été définie par le champ? (Primefaces)

J'ajouté le code ci-dessous, vous pouvez donc peut-être reproduire ce comportement.

test.xhtml - échantillon xhtml avec les deux champs primefaces et bootsfaces

<?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:b="http://bootsfaces.net/ui" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:p="http://primefaces.org/ui"> 

    <h:head> 
     <meta charset="UTF-8"/> 
    </h:head> 

    <h:body> 
     <h:form id="form"> 
      <b:panel id="filterPanel" title="Filter properties" immediate="true" collapsed="false" collapsible="true"> 
       <b:row> 
        <b:column span="12"> 
         <b:inputText id="dateA" type="date" value="#{test.dateA}" immediate="true" class="form-control"> 
          <f:ajax event="change" listener="#{test.searchA()}"/> 
         </b:inputText> 
        </b:column> 
       </b:row> 
       <b:row> 
        <b:column span="12"> 
         <p:inputText id="dateB" type="date" value="#{test.dateB}" immediate="true" class="form-control"> 
          <p:ajax event="change" listener="#{test.searchB()}"/> 
         </p:inputText> 
        </b:column> 
       </b:row> 
      </b:panel> 
     </h:form> 
    </h:body> 
</html> 

TestBean.java - mon haricot pour définir les valeurs et appeler des méthodes

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

@ManagedBean(name = "test") 
@ViewScoped 
public class TestBean { 

    private String dateA; 
    private String dateB; 

    public void searchA() { 
     System.out.println("Search A"); 
    } 

    public void searchB() { 
     System.out.println("Search B"); 
    } 

    public String getDateA() { 
     return dateA; 
    } 

    public void setDateA(String dateA) { 
     this.dateA = dateA; 
     System.out.println(dateA); 
    } 

    public String getDateB() { 
     return dateB; 
    } 

    public void setDateB(String dateB) { 
     this.dateB = dateB; 
     System.out.println(dateB); 
    } 

} 

S'il vous plaît aidez-moi à trouver une solution ou expliquez-moi ce que je fais mal ici.

Merci MWeber

+0

Vous pouvez essayer BootsFaces 0.8.5 que nous avons publié il y a 2 jours. Il semble que nous avons résolu quelques bugs concernant cette question là-dedans. (L'auditeur est appelé correctement) Cependant, je ne suis pas sûr, pourquoi la méthode du haricot de back-up est appelée d'abord parfois et n'a pas le temps de rechercher pour le moment. Donc, malheureusement, je ne peux pas fournir une réponse complète tout à l'heure, mais je peux recommander d'essayer la nouvelle version :) – Zhedar

+0

Aussi, je ne pouvais pas reproduire la perte de la mise au point du tout. Quel navigateur utilisez-vous? – Zhedar

+0

J'utilise Chrome 50.0.2661.94. J'ai déjà essayé avec Bootsfaces 0.8.5. Ça fonctionne bien. Le problème est que je ne peux pas utiliser 0.8.5 à cause d'un problème/bug différent avec cette version. Il est possible que je pose une nouvelle question sur le problème en 0.8.5 mais actuellement je n'ai pas du tout le temps. Je pense que je vais essayer une solution de contournement sans ajax pour appeler la méthode avec un bouton ou quelque chose comme ça. Ou j'essaie à nouveau Primefaces en changeant la phase quand l'auditeur est invoqué. – mweber

Répondre

2

Vous avez trouvé une différence subtile entre BootsFaces et PrimeFaces. Je vous recommande de toujours définir les valeurs de process et update pour des raisons de clarté. Dans votre cas,

<b:inputText id="dateA" type="date" value="#{test.dateA}" immediate="true" class="form-control"> 
     <f:ajax event="change" listener="#{test.searchA()}" render="@none"/> 
    </b:inputText> 

fait que le champ de saisie BootsFaces se comporte exactement comme son homologue PrimeFaces. Les valeurs par défaut update et process sont différentes. Depuis BootsFaces 0.8.5, les valeurs par défaut sont:

  • process = "form @" pour <b:commandButton /> et <b:commandLink />
  • processus = "@ ce" pour tous les autres composants de BootsFaces
  • update = "form @" pour chaque composant BootsFaces

Selon Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes, les valeurs par défaut de PrimeFaces sont: enter image description here

pour e e souci de commodité, voici ma version du fichier XHTML:
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " xmlns: b =" http: // bootsfaces .net/ui »
xmlns: h = "http://java.sun.com/jsf/html"
xmlns: f = "http://java.sun.com/jsf/core"
xmlns : p = "http://primefaces.org/ui">

 <h:head>                            
      <meta charset="UTF-8"/>                       
     </h:head>                           

     <h:body>                            
      <h:form id="form">                        
       <b:panel id="filterPanel" title="Filter properties" immediate="true" collapsed="false" collapsible="true"> 
        <b:row>                         
         <b:column span="12">                     
          <b:inputText id="dateA" type="date" value="#{test.dateA}" immediate="true" class="form-control"> 
           <f:ajax event="change" listener="#{test.searchA()}" render="@none"/>       
          </b:inputText>                     
         </b:column>                       
        </b:row>                         
        <b:row>                         
         <b:column span="12">                     
          <p:inputText id="dateB" type="date" value="#{test.dateB}" immediate="true" class="form-control"> 
           <p:ajax event="change" listener="#{test.searchB()}"/>          
          </p:inputText>                     
         </b:column>                       
        </b:row>                         
       </b:panel>                         
      </h:form>                          
     </h:body>                           
    </html>                             

Je l'ai testé avec BootsFaces 0.8.5.

+0

Désolé pour ma réponse en retard. J'ai été très occupé hier. J'ai essayé votre exemple mais cela n'a pas fonctionné pour moi. C'est toujours le même problème. Peut-être que j'ai un problème ailleurs qui m'empêche d'utiliser cette approche. Est-ce même possible que quelque chose bloque cela? – mweber

+0

J'ai ajouté le fichier XHTML complet - peut-être y a-t-il une autre différence subtile. Voyez-vous une requête AJAX pendant que vous tapez? La première requête AJAX se produit une fois que les données sont valides - dans mon exemple, c'était après avoir tapé "12.12.1" (avec les paramètres régionaux européens, d'où les points). –

+0

Maintenant, je connais le problème. Vous avez testé avec la version 0.8.5 mais j'ai utilisé la version 0.8.1. J'ai dit que je ne peux pas utiliser 0.8.5 mais peut-être que je vais essayer. Puis-je vous envoyer un message privé pour poser quelques questions à propos de bootsfaces? Je vais accepter votre réponse parce que c'est la solution à ce problème mais pour la version 0.8.1 cela ne fonctionne pas avec le même code. – mweber