In der MySQL-Datenbank gibt es drei Tabellen: category
, sub_category
und brand
(Hersteller), wobei category
ein Elternteil des Rests ist, d. h. sub_category
und brand
. Ich hoffe, die Beziehung zwischen den Menüs kann aufgrund der Tabellenbeziehungen klarer sein.
Alle drei <p:selectOneMenu>
s werden in einem <p:dataTable>
in drei entsprechenden Spalten platziert, wie durch <p:column>
identifiziert. Ich ignoriere <p:column>
, <p:cellEditor>
, <f:facet name="output">
, <f:facet name="input">
, <p:rowEditor>
und all diese Ärgernisse für die Kürze.
row
entspricht einer von JPA verwalteten Entität, die in diesem Fall product
ist, wie von var="row"
in der verknüpften <p:dataTable>
angegeben.
Dies ist das tatsächliche Fragezeichen: Wenn ein Element (das erste) mit einem null
-Wert in categoryList
(übergeordnet) ausgewählt ist, werden untergeordnete Elemente subCategoryList
und% angezeigt co_de% sollte Rest zu leer sein.
Kategorieliste:
%Vor%Unterkategorie Liste:
%Vor%Marke (Hersteller) Liste:
%Vor%Die verwaltete Bean (Lazy-Datenmodell kann im Zusammenhang mit dieser Frage ignoriert werden):
%Vor% In jedem Fall wird der ausgewählte Wert in einem dieser Menüs nicht an die entsprechende Backing-Bean geliefert. Es ist nur in dem Modell verfügbar, das von JPA unterstützt wird ( brandList
, value="#{row.category}"
bzw. value="#{row.subCategory}"
).
► Wie wird der Backing-Bean signalisiert, dass das erste Element mit einem value="#{row.brand}"
-Wert (mit der Bezeichnung "Select") im übergeordneten Menü ausgewählt wurde, um seine untergeordneten Listen auf leer zurückzusetzen? Dies sollte auf jede mögliche Weise geschehen, wenn dies nicht möglich ist.
Ich benutze PrimeFaces 5.2 final (Community Release) und Mojarra 2.2.12.
Dies wird nicht benötigt, es sei denn, es gibt einen Null-Fremdschlüssel in der zugrundeliegenden Datenbanktabelle speziell mit der herstellerspezifischen Option null
, die ein optionales Elternelement in jeder (oder einigen) entsprechenden untergeordneten Zeile zulässt.
Zu dem Punkt müssen Sie sicherstellen, dass der Getter% <f:selectItem>
mit einem Argument null
aufgerufen wird. Mit anderen Worten, die #{row.category}
muss null
sein. Da Sie für #{row.category}
das Modell verwenden, das in dieser Antwort gezeigt wird, Füllen Sie p: selectOneMenu basierend auf einem anderen p: selectOneMenu in jeder Zeile von ap: dataTable , höchstwahrscheinlich wie unten,
dann ist die #{row.category}
tatsächlich nie null
, wenn es eine subCategory
gibt. Dies ist der Fall, wenn ein vorhandener Dateneintrag im View angezeigt wird.
Sie müssen das subCategory
(und brand
) explizit explizit aufheben, wenn die Eigenschaft transient category
explizit auf null gesetzt ist. Dieses Versehen ist inzwischen in der erwähnten Antwort behoben. So sollte Ihre neue setCategory()
-Methode aussehen:
Auf diese Weise gibt das getCategory()
korrekt null
und damit auch das übergebene #{row.category}
zurück.
Tags und Links jsf primefaces selectonemenu