2010-11-16 19 views
2

Ressemble simple, mais ne fonctionne pas)h: le contenu affiché sur dataTable chargement de la page .jsf, au lieu de commandLink cliquez seulement

Lorsque .jsf page est chargée, les valeurs de DB est représentée.
dao morceau de impl:

public List<Product> getProducts() { 
    return getHibernateTemplate().find("from Product"); 

} 

morceau géré de haricot:

public List<Product> getProducts() { 
    return this.getProductManager().getProducts(); 
} 

J'onformément que f:ajax cela fonctionne par clic seulement:

  <h:form> 

      <h:commandLink value="show" action="nothing"> 
       <f:ajax render="pr"/> 
      </h:commandLink> 


      <h:dataTable var="product" id="pr" value="#{showProducts.products}"> 
        <h:column>#{product.name}</h:column> 
      </h:dataTable> 

     </h:form> 

Et les données sont visibles sur la page, quand il est chargé. Avec Firebug je peux voir, que les données sont actualisées par un clic, donc ajax fait son travail.

Ai-je besoin d'attributs supplémentaires pour l'élément h:dataTable pour que le contenu de la table soit affiché sur un clic uniquement?

Merci.

Répondre

1

Vous devez masquer la datatable lors de la demande initiale et laisser le lien de commande basculer vers un booléen dont dépend l'attribut rendered de la base de données.

Facelets:

<h:form> 
    <h:commandLink value="show" action="#{showProducts.toggleShow}"> 
     <f:ajax render="products"/> 
    </h:commandLink> 
    <h:panelGroup id="products"> 
     <h:dataTable var="product" value="#{showProducts.products}" rendered="#{!showProducts.show}"> 
      <h:column>#{product.name}</h:column> 
     </h:dataTable> 
    </h:panelGroup> 
</h:form> 

Bean:

private boolean show; 

public void toggleShow() { 
    show = !show; // Or just show = true; 
} 

public boolean isShow() { 
    return show; 
} 

Cela dit, ce n'est pas la meilleure pratique pour exécuter la logique métier/base de données coûteuse dans un getter. Un getter peut être appelé plus d'une fois dans la vie du haricot. Faites plutôt ce travail dans le constructeur du bean ou la méthode @PostConstruct.

private List<Product> products; 

@PostConstruct 
public void init() { 
    products = this.getProductManager().getProducts(); 
} 

public List<Product> getProducts() { 
    return products; 
} 

Ou si elle a réellement besoin d'être chargé paresseusement, alors plutôt le faire:

private List<Product> products; 

public List<Product> getProducts() { 
    if (products == null) { 
     products = this.getProductManager().getProducts(); 
    } 
    return products; 
} 
+0

oui, il est venu à moi aussi que « rendu » devrait être used.I've a une erreur Unfortunetely : "La méthode doit avoir la signature" String method() "mais a la signature" void method() "pour l'appel de la méthode toggleShow – sergionni

+0

Est-ce encore Eclipse avec son validateur EL inutile? Ignorez-le et exécutez-le. validateur ou corrigez-le selon le message d'erreur et laissez-le retourner 'null' – BalusC

+0

oui, BalusC, vous avez raison, c'est Eclipses.Erange étrange got: malformedXML: Pendant la mise à jour: j_idt5: pro canaux non trouvés – sergionni