JSF Wert in Bean übertragen, aus selected Treetable-Node


#1

Hallo zusammen,

ich habe untenstehenden Treetable. Die letzte Spalte ist ein Icon, welches in der Bean eine Methode aufrufen soll (Um eine Weiterleitung anzustoßen) dabei soll der Knoten mit übergeben werden, aus welcher Zeile das Icon geklickt wurde.

Leider ist mein selectedCategory immer null. Ich vermute es liegt am Request-Scop kann das sein? Nutze das JSF mit SpringBoot, da gibt es leider keinen ViewScope. Setzte ich testweise auf @Scope(value = “application”) wird der Wert gesetzt. Aber eben im falschen Scope. Hat jemand ne Idee, wie ich in der Bean an den selectedNode komme?

Eine andere Variante wäre noch im “RequestScope”
Map map = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
map.get(“form:categoriesTree:???”) < aber wie finde ich heraus, wie dieser Key heißt? Den kompletten TreeNode bekomme ich in der Bean, aber keinen selectedNode

<p:treeTable id="categoriesTree" rows="20" scrollable="true" value="#{categoriesOverview.treeNode}" var="category">
                            <p:ajax event="select" actionListener="#{categoriesOverview.goToProducts}"  />
                            <p:column  headerText="Kategorien">
                                <h:outputText value="#{category.categoryName}"/>
                            </p:column>
                            <p:column style="width:24px" headerText="(p4)" priority="4">
                                <p:commandLink value="#{categoriesOverview.selectedCategory}" actionListener="#{categoriesOverview.goToProducts}" title="View Detail" styleClass="ui-icon pi pi-search">
                                    <f:setPropertyActionListener value="#{category}" target="#{categoriesOverview.selectedCategory}"/>
                                </p:commandLink>
                            </p:column>
                        </p:treeTable>

Edit: Meine Bean:

@Component
@Scope(value = "application")
public class CategoriesOverview {
private TreeNode treeNode;

private Category selectedCategory; //Auch Typ TreeNode bleibt null
 public void goToProducts(){
    //hier brauch ich den selected Node
}
//getter setter
}

#2

Nun bin ich ein Stück weiter:

<p:ajax event="select" listener="#{categoriesOverview.onNodeSelect}"  />
public void onNodeSelect(NodeSelectEvent event){
        System.out.println(event.get....);
    }

Bringt mir schon mal den gewählten Node. Geht aber nur, wenn ich auf die Zeile in der TreeTable klicke, nicht aber wenn ich auf den CommandLink in der entsprechenden Zeile klicke.


#3

Ich bin jetzt schon länger kein PrimeFaces-Experte mehr, aber eigentlich müsstest Du auch ein Ajax-Event am CommandButton selbst registrieren.


#4

Hey Sym. Danke!
Du hast mich auf die Idee gebracht, ich nutze einen Commalink, hab nun mal einen CommandButton genutzt und siehe da. klappt =)

<p:treeTable id="categoriesTree" rows="20" selectionMode="single" scrollable="true" value="#{categoriesOverview.treeNode}" var="category">
<p:column  headerText="Kategorien">
<h:outputText value="#{category.categoryName}"/>
</p:column>
<p:column style="width:24px" headerText="(p4)" priority="4">
<p:commandButton  ajax="true" value="#{categoriesOverview.selectedCategory}" action="#{categoriesOverview.goToProducts}" title="View Detail" styleClass="ui-icon pi pi-search">
   <f:setPropertyActionListener value="#{category}" target="#{categoriesOverview.selectedCategory}"/>
</p:commandButton>
</p:column>
</p:treeTable>

Was genau macht Ajax? Wird das aufgerufen, bevor der JSF Lifecycle beginnt oder wie könnte man Ajax in einem Satz erklären?


#5

Ok, es geht fast. Sehr komisch, wenn ich auf einen Hauptnode klicke, der noch Unterkategorien hat, gehts.

Zb Drogerie. Klicke ich auf Massageöl, wird meine action Methode nicht aufgerufen. Hat noch jemand ne Idee?

image