Skinning#
<context-param> <param-name>org.richfaces.enableControlSkinning</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>org.richfaces.enableControlSkinningClasses</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>org.richfaces.skin</param-name> <param-value>blueSky</param-value> </context-param>
Tree#
Um die Selection-Events zu bekommen, sind einige Dinge zu beachten:- Der Tree muss sich in einem Form-Tag befinden
- Das selectionChangeListener-Attribut funktioniert nicht, es muss ein zusätzlicher Tag rich:treeSelectionChangeListener verwendet werden
- Die Keys der TreeNodes können Probleme bereiten, wenn es Integers sind oder Sonderzeichen enthalten
<h:form id="tree-form"> <rich:tree id="tree" value="#{bean.tree}" selectionType="ajax"> <rich:treeSelectionChangeListener listener="#{bean.changeSelection}"/> <rich:treeNode> <h:outputText value="#{node.name}"/> </rich:treeNode> </rich:tree> </h:form>
public void changeSelection(TreeSelectionChangeEvent event) { System.out.println("Selection changed: " + event.getNewSelection()); }
Fixes#
Collapsible Sub-Table#
In Firefox kommt die Meldung "TypeError: RichFaces.ui.CollapsibleSubTable is not a constructor", im Internet-Explorer kommt es zu nicht lokalisierenden Javascript-Fehlern. Ursache sind fehlende Resourcen, der Fix besteht im manuellen Einbinden:<h:outputScript name="collapsible-subtable.js" library="org.richfaces"/> <h:outputStylesheet name="collapsible-subtable.ecss" library="org.richfaces"/>
AJAX-Errors#
Richfaces verbiegt das AJAX-Framework von JSF, vor allem um seinen mehr oder weniger nützlichen AJAX-Queue zu implementieren. Dabei entstehen gravierende Nebenwirkungen, wie zum Beispiel dass keine AJAX-Requests mehr mit einer DOM-Element-Id abgeschickt werden können, nur noch mit dem DOM-Element selbst.Ein anderes Problem ist das Verschlucken von AJAX-Fehlermeldungen. Richfaces registriert mit jsf.ajax.addOnError(onError) einen eigenen Error-Handler, in dessen Code dann steht "//TODO: what if somebody is going to clear queue on error?". Abhilfe schafft das Registrieren eines weiteren Error-Handlers mit einer sinnvollen Ausgabe:
<c:if test="#{facesContext.application.projectStage == 'Development'}"> <script type="text/javascript"> jsf.ajax.addOnError(function (data) { alert(data.description); }); </script> </c:if>