2010-07-01 5 views
1

Je viens juste de commencer à apprendre le framework de couture. J'ai décidé de coder deux menus déroulants. Une liste de catégories et d'autres sous-catégories. L'idée est que l'utilisateur choisisse d'abord une catégorie et qu'une sous-catégorie sera créée.Créer un menu déroulant en couture avec s: selectItems

<h:selectOneMenu value="#{manager.category}" required="true"> 
      <a:support event="onfocus" ajaxSingle="true" action="#{manager.dothis()}"/> 
      <s:selectItems value="#{manager.categories}" var="cat" label="#{cat.categoryDescription}" noSelectionLabel="Select a Category"/> 
      <s:convertEntity /> 

Au-dessus, je suis en train d'appeler la méthode dothis() sur le focus de l'événement, mais sa ne fonctionne pas.

Qu'est-ce que je fais mal ici?

Merci.

Répondre

1
  1. Est-ce que votre # {manager.categories} est déjà remplie?
  2. Que fait # {manager.dothis()}?

Vous ne voulez probablement pas à faire quoi que ce soit onfocus() ... à moins peut-être que vous êtes paresseux charger les valeurs initiales (que je ne pense pas que vous êtes). Vous devriez également indiquer quelque chose dans le tag <a:support>, sinon votre action n'affectera rien sur votre page.

Voici mon approche de ceux-ci (en supposant # {} manager.categories est peuplée):

<h:selectOneMenu id="category" value="#{manager.category}" required="true"> 
      <a:support event="onchange" ajaxSingle="true" action="#{manager.populateSubCategories()}" reRender="subcategory"/> 
      <s:selectItems value="#{manager.categories}" var="cat" label="#{cat.categoryDescription}" noSelectionLabel="Select a Category"/> 
      <s:convertEntity /> 
</h:selectOneMenu> 

<h:selectOneMenu id="subcategory" value="#{manager.subcategory}" required="true"> 
      <s:selectItems value="#{manager.subcategories}" var="subcat" label="#{subcat.categoryDescription}" noSelectionLabel="Select a Sub-Category"/> 
      <s:convertEntity /> 
</h:selectOneMenu> 
1

Voici mon haricot:


@Stateful 
@Name("requestManager") 
public class RequestManagerBean implements RequestManager 
{ 
    @Logger private Log log; 

    @In StatusMessages statusMessages; 

    private Category category; 

    private Subcategory subcategory; 

    @Out(required=false) 
    private List categories; 

    private List subcategories; 

    @PersistenceContext 
    EntityManager entityManager; 
    public void createRequest() 
    { 
     // implement your business logic here 
     log.info("manager.createRequest() action called with: #{manager.value}"); 
     statusMessages.add("createRequest #{manager.value}"); 
    } 

    public Category getCategory() { 
     return category; 
    } 

    public void setCategory(Category category) { 
     this.category = category; 
    } 


    public Subcategory getSubcategory() { 
     return subcategory; 
    } 

    public void setSubcategory(Subcategory subcategory) { 
     this.subcategory = subcategory; 
    } 

    public List getCategories() { 
     return categories; 
    } 

    public void setCategories(List categories) { 
     this.categories = categories; 
    } 

    public List getSubcategories() { 
     //System.out.println("returning " + subcategories.size() + "subcategories.."); 
     return subcategories; 
    } 

    public void setSubcategories(List subcategories) { 
     this.subcategories = subcategories; 
    } 

    @Destroy 
    @Remove 
    public void destroy() {} 

    @Factory("categories") 
    public void loadCat() { 
     System.out.println("loadCat called.........."); 
     categories = entityManager.createQuery("select c from Category c order by c.categoryDescription").getResultList(); 
    } 

    public void callme() { 

     System.out.println("callme............"); 
     subcategories = category.getSubcategoryList(); 
     System.out.println(subcategories.size()); 
    } 
}

et forme

 

<rich:panel> <f:facet name="header">Create Request</f:facet> <h:outputText value="Category: "/> <h:selectOneMenu id="categoryField" value="#{requestManager.category}"> <s:selectItems var="cat" value="#{categories}" label="#{cat.categoryDescription}" noSelectionLabel="Select a Category"/> <s:convertEntity /> <a:support event="onchange" ajaxSingle="true" action="#{requestManager.callme}" reRender="subcategoryField" /> </h:selectOneMenu> <br /> <br /> <h:outputText value="Subcategory: "/> <h:selectOneMenu id="subcategoryField" value="#{requestManager.subcategory}" required="true"> <s:selectItems value="#{requestManager.subcategories}" var="subcat" label="#{subcat.subcategoryDescription}" noSelectionLabel="Select a Sub-Category"/> <s:convertEntity /> </h:selectOneMenu> <div style="clear:both"/> </rich:panel> <div class="actionButtons"> <h:commandButton id="createRequest" value="Submit" action="#{requestManager.createRequest}"/> </div> </h:form>

/pre >

+0

@alkesh Utiliser @Factory Il est évalué une fois, et une seule fois. Conseil: Ne pas poster une réponse lorsque vous souhaitez poster un commentaire. Voir le lien Ajouter un commentaire –

+0

Quelle est la différence entre @Factory et @Create. Et, j'ai essayé le code ci-dessus pour une raison quelconque manager.populateCategories() n'est pas appelé. Aussi, je le débogue. J'utilise log.debug() mais où sont stockés ces journaux? Merci les gars, j'apprécie que vous preniez le temps de m'aider. – Nish

+0

bien, donc j'ai compris le diff entre Factory et Create. Maintenant, seul le problème est que l'action ne fonctionne pas onchange. – Nish