2010-11-02 5 views
4

J'ai un composant XBL qui crée un contrôle checkbox en javascript. La valeur est définie en javascript lors de l'initialisation du composant. Le composant fonctionne bien lorsqu'il n'est pas utilisé à l'intérieur de la répétition mais à l'intérieur de la répétition lorsque j'essaie de déplacer les lignes vers le haut ou vers le bas. Le contrôle XBL ne change pas l'état. L'événement xxforms-itération déplacé est déclenché sur la ligne qui est déplacée mais ne se déclenche pas sur la ligne qui change de position pendant ce déplacementRéinitialiser le composant XBL sur xxforms-iteration-moved

Par exemple, si je déplace la ligne 3 vers la ligne 2, alors xxforms-itération déplacée est déclenchée sur la ligne 3, mais je veux réinitialiser les composants de la ligne 2 ainsi que mon état est enregistré en javascript.

Je pense que xxforms-itération-déplacé devrait être tiré sur les deux lignes qui ont changé de position? C'est vraiment un échange qui implique les deux lignes. Commentez s'il vous plaît.

Edit: J'utilise le formulaire Orbeon Runner

+0

Quel processeur XForms utilisez-vous? –

Répondre

1

Pour quels composants le xxforms-iteration-moved est distribué est une question de la façon dont xxforms-iteration-moved est défini. À l'heure actuelle, il est envoyé aux contrôles à l'intérieur des itérations qui ont été déplacées. Ce dont vous avez besoin est de gérer l'événement xforms-enabled, en plus de xxforms-iteration-moved. Considérons l'exemple suivant: vous commencez avec une liste avec "a, c, d". Si vous insérez "b" après "a", le nouveau "b" reçoit un xforms-enabled et "c, d" un xxforms-iteration-moved. Donc, en réagissant aux deux événements, vous devriez pouvoir (ré) initialiser votre composant si nécessaire.

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml" 
     xmlns:xforms="http://www.w3.org/2002/xforms" 
     xmlns:xxforms="http://orbeon.org/oxf/xml/xforms" 
     xmlns:ev="http://www.w3.org/2001/xml-events" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:fr="http://orbeon.org/oxf/xml/form-runner"> 
    <xhtml:head> 
     <xhtml:title>Iteration moved</xhtml:title> 
     <xforms:model> 
      <xforms:instance> 
       <instance> 
        <letter>a</letter> 
        <letter>c</letter> 
        <letter>d</letter> 
        <letter>e</letter> 
       </instance> 
      </xforms:instance> 
     </xforms:model> 
    </xhtml:head> 
    <xhtml:body> 
     <fr:button> 
      <xforms:label>Insert b</xforms:label> 
      <xforms:insert ev:event="DOMActivate" nodeset="letter" at="1" position="after" origin="xxforms:element('letter', 'b')"/> 
     </fr:button> 
     <fr:button> 
      <xforms:label>Delete c</xforms:label> 
      <xforms:delete ev:event="DOMActivate" nodeset="letter[. = 'c']"/> 
     </fr:button> 
     <xforms:repeat id="letter-repeat" nodeset="letter"> 
      <xforms:output id="letter" value="."> 
       <xforms:message ev:event="xxforms-iteration-moved" level="modal" value="concat('xxforms-iteration-moved : ', .)"/> 
       <xforms:message ev:event="xforms-enabled" level="modal" value="concat('xforms-enabled : ', .)"/> 
      </xforms:output> 
     </xforms:repeat> 
    </xhtml:body> 
</xhtml:html> 

Je dois ajouter que si vous attendez votre composant à utiliser dans une répétition (et, tôt ou tard, chaque composant est), en ce moment, en raison de la façon dont les répétitions fonctionnent sur le côté client, si vous faites un peu travailler pour initialiser le composant sur xforms-enabled, vous avez probablement besoin de faire cela aussi sur xxforms-iteration-moved. Par exemple, voir how this is done dans le composant fr:button.

+0

D'accord Alex. C'est comme ça que je l'ai dans mon contrôle RBL xbl. \t \t \t \t \t \t \t \t \t \t \t \t \t YAHOO.xbl.fr.RTE.instance (this) .init(); Vous avez dit "En ce moment, il est distribué aux contrôles à l'intérieur des itérations qui ont été déplacées". Ainsi, lorsque la troisième itération est déplacée vers la deuxième itération, l'événement déplacé par xxforms-itération est envoyé au contrôle RTE qui se trouve dans la troisième itération. Il n'est pas envoyé à la 2ème itération. J'étais sous l'impression que xxforms-itération déplacé sera envoyé aux deux itérations. – BinnyG

+0

BinnyG, comment la 3ème itération s'est-elle déplacée pour devenir la 2ème? Est-ce que le 1er ou le 2ème a été supprimé? – avernet

+1

BinnyG, en ajoutant à mon commentaire précédent, si vous supprimez le 2ème et le 3ème devient le 2ème, le 2ème maintenant devrait recevoir un événement 'xxforms-iteration-moved'. Pour confirmer cela, exécutez le code ci-dessus (auquel j'ai ajouté un bouton "Supprimer c"), cliquez sur ce bouton: vous passerez de "a, c, d, e" à "a, d, e"; à ce stade, "d" et "e" reçoivent un événement "xxforms-itération-déplacé". – avernet

Questions connexes