2017-10-16 17 views
0

J'ai un formulaire dans lequel certains champs de formulaire sont générés dynamiquement en fonction du produit sélectionné par l'utilisateur. Lorsque les utilisateurs sélectionnent un produit, les attributs du produit sont extraits de la base de données et les champs de formulaire correspondants sont ajoutés à la vue. Lorsque le formulaire est soumis, les valeurs des champs ajoutés dynamiquement sont également envoyées au serveur. Cependant, les objets modèles contenant les valeurs des champs dynamiques ne sont pas mis à jour (ViewScoped est utilisé) J'ai essayé à la fois ui: repeat et p: dataGrid (je lis ui: répéter l'implémentation de mojarra est problématique) Rien n'a changé.Les beans de modèle JSF ne sont pas mis à jour pour les champs de formulaire dynamiquement créés

Ci-dessous vous pouvez voir la facelet créant les champs dynamiques. Lorsque la liste des attributs est mise à jour, 'attributeFilterPanel' est mis à jour avec l'appel ajax.

attributeFilters est une carte. Pour chaque attribut, la carte des filtres est pré-remplie avec une entrée utilisant attribute.name comme clé.

Toute aide est vraiment appréciée. Merci.

Note: Je cours Mojarra 2.2.12.

<h:panelGroup id="attributeFilterPanel"> 
    <h:panelGroup id="filtersGroup" rendered="#{not empty attributes }"> 
     <p:dataGrid columns="3" var="attribute" value="#{attributes}" layout="grid" paginator="false"> 
      <h:panelGroup> 
       <p:outputLabel value="#{attribute.label}"/> 

       <p:selectOneMenu id="match_mode_${attribute.name}" 
           rendered="#{attribute.valueType =='STRING'}" 
           value="#{attributeFilters[attribute.name].matchMode}"> 
        <f:selectItem itemValue="EQUALS" itemLabel="#{msg.equals}"/> 
        <f:selectItem itemValue="CONTAINS" itemLabel="#{msg.contains}"/> 
        <f:selectItem itemValue="STARTS_WITH" itemLabel="#{msg.startsWith}"/> 
        <f:selectItem itemValue="ENDS_WITH" itemLabel="#{msg.endsWith}"/> 
       </p:selectOneMenu> 

       <p:selectOneMenu id="amatch_mode_${attribute.name}" 
           rendered="#{attribute.valueType =='INTEGER' or attribute.valueType == 'NUMERIC'}" 
           value="#{attributeFilters[attribute.name].matchMode}"> 
        <f:selectItem itemValue="EQUALS" itemLabel="#{msg.equals}"/> 
        <f:selectItem itemValue="LESS_OR_EQUAL" itemLabel="#{msg.lessOrEqual}"/> 
        <f:selectItem itemValue="GREATER_OR_EQUAL" itemLabel="#{msg.greaterOrEqual}"/> 
       </p:selectOneMenu> 



       <p:inputText id="sattribute_${attribute.name}" 
          rendered="#{attribute.valueType =='STRING'}" 
          value="#{attributeFilters[attribute.name].value}"/> 
       <p:inputNumber id="iattribute_${attribute.name}" 
           rendered="#{attribute.valueType == 'INTEGER'}" decimalPlaces="0" 
           value="#{attributeFilters[attribute.name].value}"/> 
       <p:inputNumber id="nattribute_${attribute.name}" 
           rendered="#{attribute.valueType == 'NUMERIC'}" decimalPlaces="3" 
           value="#{attributeFilters[attribute.name].value}"/> 
       <p:selectBooleanCheckbox id="battribute_${attribute.name}" 
             rendered="#{attribute.valueType == 'BOOLEAN'}" 
             value="#{attributeFilters[attribute.name].value}"/> 
      </h:panelGroup> 
     </p:dataGrid> 
    </h:panelGroup> 
</h:panelGroup> 

Le filtre est un pojo simple.

public class Filter { 
private String name; 
private Object value; 
private MatchMode matchMode; 

public Filter(String name) { 
    this.name = name; 
    this.matchMode = MatchMode.EQUALS; 
} 


public void setValue(Object value) { 
    this.value = value; 
} 
public Object getValue() { 
    return value; 
} 

public void setMatchMode(MatchMode matchMode) { 
    this.matchMode = matchMode; 
} 

public String getName() { 
    return name; 
} 


public MatchMode getMatchMode() { 
    return matchMode; 
} 

}

Répondre

0

La seule façon que je peux le faire fonctionner est l'ajout d'événements de changement de valeur ajax pour chaque champ de formulaire. Les beans modèles sont mis à jour avec des mises à jour ajax. Il est strage que les beans du modèle ne sont pas mis à jour avec les demandes de post, mais les événements de changement de valeur sont reflétés.

<p:ajax event="valueChange" process="@this" 
            update="@widgetVar(productAttibuteGrid)"/>