2017-09-05 2 views
0

J'essaie de lier une boîte d'entrée à une entrée dans un champ à valeurs multiples, Quelque chose comme ceci:Comment lier un champ à une source de données dans une répétition en utilisant EL?

<xp:repeat id="repeat6" rows="30" var="rows" indexVar="ind"> 
    <xp:this.value><![CDATA[#{javascript:order.getItemValue("ArtNo")}]]></xp:this.value> 
    <xp:inputText id="inputText9" style="width:20px" value="#{order.ArtQuantity[ind]}"> 
</xp:repeat> 

Quand il y a deux valeurs dans ArtNo champ cela fonctionne, mais pas quand il y a une seule valeur. Ma conjecture ici est que quand il n'y a qu'une seule entrée ce n'est plus un tableau car j'ai l'erreur suivante:

Erreur lors de l'obtention de la propriété '0' du bean de type java.lang.Double - PropertyNotFoundException Erreur, impossible de localiser le composant :

comment puis-je corriger mon code afin que l'ordre de code EL.ArtQuantity [ind] fonctionne toujours, c'est à dire est toujours un tableau?

grâce

Thomas

Répondre

2

Vous pouvez modifier la répétition avec un texte simple à binded #{order.ArtQuantity}. La propriété Rendu peut modifier ces deux en fonction de la vérification isArray.

MISE À JOUR

Comme commenté par Knut, la solution de shilem ne fonctionne pas. Ma conclusion:

  • vérification de valeurs multiples ne fonctionne pas - vous ne pouvez pas obtenir size() de valeur scalaire retournée par getItemValue du champ avec une seule valeur. Changement simple pour le faire fonctionner: getComponent("repeat6").getRowCount() == 1 et pour plusieurs valeurs getComponent("repeat6").getRowCount() > 1. Laid, je sais.
  • La liaison aux éléments vectoriels ne fonctionne pas. Il devrait (comme ici: https://stackoverflow.com/a/6743138/206265). Il échoue avec datasource - il semble que l'application de la valeur soumise pour [n] ème élément est effectuée sur un vecteur temporaire récupéré par la première partie de la liaison order.artQuantity. Le champ du document n'est pas mis à jour. Semble être un bug.

solution possible est de créer un contrôle dédié, qui gère toutes les modifications en magasin interne (support de haricot, la variable scope, dataContext) et met à jour le document une fois avec une valeur combinée de tous les éléments de la liste.

+0

Comment ça marche avec ArtQuantity avec trois éléments? Comment obtenez-vous chaque élément dans la répétition? La variable repeat est basée sur ArtNo et non sur ArtQuantity. Donc, la variable d'index 'ind' doit être utilisée quelque part ... –

+0

Bon point. Je suppose que ArtQuantity est un champ d'ombre avec le même nombre d'éléments que ArtNo. Dans ce cas, pour chaque valeur dans ArtNo, une ligne de répétition affiche la valeur ArtQuantity. –

+0

Oui, je suppose que aussi.Mais, si vous utilisez '# {order.ArtQuantity}' comme valeur inputText, alors pour * chaque * ArtNo * all * ArtQuantity sont affichés dans le champ de texte de saisie. –

1

L'approche que vous utilisez actuellement me dit que vous n'avez aucune gestion de bean, sans parler d'un meilleur pattern DAO/DTO en plus de ce que XPages offre hors de la boîte.

Il y a une solution inélégante pour ce (que peut-on attendre SSJS est l'incarnation même de inélégance?):

<xp:repeat value="#{order.artNo}" var="artNo" indexVar="n"> 
    <xp:inputText value="#{order.artQuantity}" 
     rendered="#{javascript: order.getItemValue('artQuantity').size() === 1}"> 
     <xp:this.converter> 
      <xp:convertNumber /> 
     </xp:this.converter> 
    </xp:inputText> 
    <xp:inputText value="#{order.artQuantity[n]}" 
     rendered="#{javascript: order.getItemValue('artQuantity').size() > 1}"> 
     <xp:this.converter> 
      <xp:convertNumber type="number" /> 
     </xp:this.converter> 
    </xp:inputText> 
</xp:repeat> 

Fondamentalement, l'un des 2 contrôles d'entrée est rendue en fonction du nombre de valeurs présentes dans artQuantity. De cette manière, toute mise à jour de l'une des valeurs d'instance de champ artQuantity sera automatiquement enregistrée dans l'élément de document. C'est le moyen le plus rapide et le plus sale de le faire.