In der Baumkomponente von RichFaces ist es möglich einen “nodeSelectListener” zu registrieren.
<rich:tree switchType="ajax" binding="#{managedBean[binding]}" componentState="#{managedBean[state]}" ajaxSubmitSelection="true" nodeSelectListener="#{managedBean[nodeListener]}" > <rich:recursiveTreeNodesAdaptor id="adapter" roots="${managedBean[treeModel]}" var="item" nodes="#{item.childs}" > <rich:treeNode id="node" > <h:outputText value="#{item.name}" /> </rich:treeNode> </rich:recursiveTreeNodesAdaptor> </rich:tree>
Der Listener wird gefeuert, wenn ein Element des Baumes selektiert bzw. angeklickt wird. Jetzt habe ich festgestellt, dass die registrierte Methode nur beim ersten Klick auf das Baumelement aufgerufen wird. Bei jedem weiteren Klick auf das selektierte Element wird zwar ein Request abgeschickt und der Lifecycle durchlaufen, jedoch wird die Methode nicht aufgerufen.
Das ist ja mal wieder ganz toll. So wie ich das sehe ist der Name “nodeSelectListener” falsch gewählt. Dem verhalten nach zu urteilen ist das eher ein “changeNodeSelecttionListener”.
Ein möglicher Workarround besteht dadrin, auf den “nodeSelectListener” zu verzichten und in der treeNode einen commandLink zu plazieren.
<rich:tree switchType="ajax" binding="#{managedBean[binding]}" componentState="#{managedBean[state]}" ajaxSubmitSelection="true" > <rich:recursiveTreeNodesAdaptor id="adapter" roots="${managedBean[treeModel]}" var="item" nodes="#{item.childs}" > <rich:treeNode id="node" > <h:commandLink action="#{treeBean.doSelectNode}" value="#{item.name}" /> </rich:treeNode> </rich:recursiveTreeNodesAdaptor> </rich:tree>