Umgebung:
JSF 1.2 / RichFaces 3.2.0.GA

Beschreibung:
In einer dataTable gibt es einen Link, der eine Zeile löschen soll – und das unabhängig von Validierungsfehlern im restlichen Formular. Daher wird immediate=”true” verwendet um die Validierung zu umgehen. Im reRender-Attribut ist die dataTable angegeben, damit die Sicht aktualisiert wird.

Problem:
Diese Vorgehensweise funktioniert nicht wie erwartet. Zwar wird immer der richtige Datensatz aus der Datenbank gelöscht, jedoch zeigt die Sicht nach dem Rerendering einen anderen Stand (bspw. fehlt eine andere Zeile). Beim Neuladen der Seite ist auch die SIcht wieder in Ordnung.

Lösung:
Statt immediate=”true” kann man im commandLink (od. commandButton) das Attribut ajaxSingle=”true” angeben. Das hat ungefähr den gleichen Effekt wie immediate=”true”, da nur der Wert dieses Knotens übertragen wird und somit nicht alle Validatoren angesprochen werden.

Eine genaure Beschreibung ist hier zu finden: http://livedemo.exadel.com/richfaces-demo/richfaces/ajaxAttributes.jsf?c=ajaxattributes

Ein Beispiel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<rich:dataTable var="kp" columnClasses="center,left,left,icon" value="#{apCtrl.current.kontaktpersonen}" id="listeKontaktpersonen">
 <rich:column>
  <f:facet name="header">Name</f:facet>
  <h:inputText id="kp_dsName" value="#{kp.dsName}" styleClass="kp_name" />
  <rich:message for="kp_dsName" ajaxRendered="true" errorClass="error" fatalClass="fatal" infoClass="info" warnClass="warn" />
 </rich:column>
 <rich:column>
  <f:facet name="header">Telefon</f:facet>
  <h:inputText id="kp_dsTelefon" value="#{kp.dsTelefon}" styleClass="kp_telefon" />
  <rich:message for="kp_dsTelefon" ajaxRendered="true" errorClass="error" fatalClass="fatal" infoClass="info" warnClass="warn" />
 </rich:column>
 <rich:column>
  <f:facet name="header">
   <rich:spacer />
  </f:facet>
  <a4j:commandLink action="#{apCtrl.deleteKontaktperson}" reRender="listeKontaktpersonen" ajaxSingle="true">
   <a4j:actionparam name="idKontaktperson" assignTo="#{apCtrl.selectedKontaktpersonId}" value="#{kp.idKontaktperson}" />
   <h:graphicImage alt="delete" title="Zeile löschen" value="/img/icons/delete.png" />
  </a4j:commandLink>
 </rich:column>
</rich:dataTable>