2013-07-15 2 views
1

Quand je fais un reRender via a4j: support de Richfaces (3.3.3) sur un h: selectOneRadio, j'ai un comportement étrange (pas toujours).JSF (1.2) bug quand reRender h: selectOneRadio

Voici ma section xhtml avec le h: selectOneRadio:

<h:selectOneRadio id="toto" value="#controller.toto}" > 
    <f:selectItem itemLabel="#{bundle['oui']}" 
    itemValue="#{true}" /> 
    <f:selectItem itemLabel="#{bundle['non']}" 
    itemValue="#{false}" /> 
</h:selectOneRadio> 
<rich:message for="toto" /> 

Quand je vais dans un navigateur je reçois ce code html:

<table id="formulaire:toto" > 
<tbody> 
<tr> 
<td> 
<input id="formulaire:toto:0" type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} })" value="true" name="formulaire:toto"> 
<label for="formulaire:toto:0"> oui</label> 
</td> 
<td> 
<input id="formulaire:toto:1" type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} })" value="false" name="formulaire:toto" checked="checked"> 
<label for="formulaire:toto:1"> non</label> 
</td> 
</tr> 
</tbody> 
</table> 

Tout va bien.

Mais lorsque celui-ci est rerender par un autre composant, les changements html et le premier élément radio est hors de la table:

<input type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} })" value="true" id="formulaire:toto:0" name="formulaire:toto" checked="checked"> 
<label for="formulaire:toto:0"> oui</label> 
<table id="formulaire:toto"> 
<tbody> 
<tr> 
<td> 
    <input type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} })" value="false" id="formulaire:toto:1" name="formulaire:toto"><label for="formulaire:toto:1"> non</label> 
</td> 
</tr> 
</tbody> 
</table> 

Il est un comportement très étrange et il casse mon style.

Pourquoi le reRender casse le code html?

Merci.

+0

Quel composant êtes-vous nouveau rendu? – user1983983

+0

Je réengendrer la h: selectOneRadio d'un autre composant comme ceci: \t \t \t \t \t \t \t \t \t \t \t \t Kiva

Répondre

1

Après de nombreuses recherches, le bug provient de neko.

Pour optimiser les performances, je change l'analyse xml (minuscule par défaut) par neko et celui-ci peut casser le html.

+0

Parsing HTML avec analyseur XML? Pas une bonne idée, mieux vaut utiliser quelque chose comme JSoup. –

+0

C'est le xhtml généré par jsf. – Kiva

+1

Je peux confirmer que ne pas utiliser Neko a également corrigé le problème pour moi aussi. Beaucoup d'articles sur les performances JSF/RichFaces recommandent de passer à Neko, mais il y a évidemment des effets secondaires. –

0

RichFaces 3 Les réponses AJAX sont servies avec l'en-tête Content-Type: text/xml. Ils sont donc censés être des documents XML valides et sont analysés en tant que tels du côté du navigateur par le code client JavaScript RichFaces. D'autre part, le code HTML généré à partir des modèles n'est pas obligatoire pour être XML valide, donc lorsque RichFaces ré-restitue un fragment d'un modèle, it tidies it up by default with the Tidy parser pour éviter les problèmes d'analyse du côté client.

Il est souvent recommandé de remplacer l'analyseur Tidy par NekoHTML pour de meilleures performances. Cependant, NekoHTML peut aller trop loin dans le processus de rangement et casser certains composants RichFaces/JSF, principalement ceux basés sur l'élément HTML. Par exemple, depuis la version 1.9.13 NekoHTML automatically adds TBODY around TR nested directly within TABLE La rétrogradation vers la version 1.9.12 de 5.5 ans rétablit ce comportement et corrige le rendu des composants. Mais ce n'est pas une option à mon humble avis car beaucoup de problèmes ont été résolus au cours des dernières années.

De mon expérience, une meilleure façon de gagner en performance et éviter ces problèmes consiste à:

  1. assurer la re-rendu des parties de vos modèles sont XML valide

  2. tomber les RANGEMENTS parseurs

Toile correspondante.extrait xml:

<context-param> 
    <param-name>org.ajax4jsf.xmlparser.ORDER</param-name> 
    <param-value>NONE</param-value> 
</context-param> 

Pour ne pas casser trop à la fois, la transition peut être géré sur une page en base page à l'aide de modèles:

<context-param> 
    <param-name>org.ajax4jsf.xmlparser.ORDER</param-name> 
    <param-value>TIDY,NEKO,NONE</param-value> 
</context-param> 
<context-param> 
    <param-name>org.ajax4jsf.xmlparser.TIDY</param-name> 
    <param-value>/pages/tidy/.*\.xhtml</param-value> 
</context-param> 
<context-param> 
    <param-name>org.ajax4jsf.xmlparser.NEKO</param-name> 
    <param-value>/pages/neko/.*\.xhtml</param-value> 
</context-param> 
Questions connexes