2013-07-15 6 views
1

Когда я делаю reRender через a4j: поддержка Richfaces (3.3.3) на h: selectOneRadio, у меня странное поведение (не каждый раз).Ошибка JSF (1.2) когда reRender h: selectOneRadio

Вот мой XHTML раздел с ч: 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" /> 

Когда я иду в браузере, я получаю этот 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> 

Все в порядке.

Но когда это один засавить другой компонент, то HTML изменения и первый элемент радио из таблицы:

<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> 

Это очень странное поведение, и это ломает мой стиль.

Почему reRender нарушает html-код?

Спасибо.

+0

Какой компонент вы перерисовка? – user1983983

+0

я засавить в час: selectOneRadio из другого компонента, как это: <ч: selectOneRadio значение = "# {controller.titi}"> \t \t \t \t \t \t \t \t \t \t \t \t Kiva

ответ

1

После многих поисков ошибка возникает из neko.

Чтобы оптимизировать характеристики, я изменяю xml-анализ (по умолчанию по умолчанию) neko, и это может сломать html.

+0

Разбор HTML с XML парсер? Не очень хорошая идея, лучше использовать что-то вроде JSoup. –

+0

Это xhtml, сгенерированный jsf. – Kiva

+1

Я могу подтвердить, что не использование Neko также устранило проблему для меня. Многие статьи о производительности JSF/RichFaces рекомендуют переключиться на Neko, но, очевидно, есть некоторые побочные эффекты. –

0

Ответы RichFaces 3 AJAX подаются с заголовком Content-Type: text/xml. Поэтому они должны быть действительными XML и анализируются как таковые на стороне браузера с помощью кода клиента JavaScript RichTaces.

С другой стороны, HTML, созданный из шаблонов, не обязательно должен быть корректным XML, поэтому, когда RichFaces повторно отображает фрагмент шаблона, it tidies it up by default with the Tidy parser, чтобы избежать проблем с обработкой на стороне клиента.

Часто рекомендуется заменить парсер Tidy на NekoHTML для лучшей производительности. Однако NekoHTML может зайти слишком далеко в процессе очистки и разбить некоторые компоненты RichFaces/JSF, в основном те, которые основаны на элементе HTML.

Например, начиная с версии 1.9.13, NekoHTML automatically adds TBODY around TR nested directly within TABLE. Переход к версии 5.5.12 с версией 1.9.12 отменяет это поведение и исправляет повторную рендеринг компонентов. Но это не вариант ИМХО, поскольку за последние годы исправлено множество проблем.

Из моего опыта, лучший способ, чтобы получить производительность и избежать этих проблем заключается в следующем:

  1. гарантировать, перерисовываются части шаблонов действительны XML

  2. падения уборки парсеры

Соответствующие сети.XML-фрагмент:

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

Чтобы избежать нарушения слишком много сразу, переход можно управлять на странице на странице основе с использованием шаблонов:

<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> 
Смежные вопросы