Zurücksetzen auf untergeordnetes Element p: Wählen Sie OneMenus in einem p: dataTable-Objekt aus, wenn ein markiertes Element in der übergeordneten Liste ausgewählt ist

8

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.

    
Tiny 31.07.2015, 01:58
quelle

1 Antwort

2

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,

%Vor%

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:

%Vor%

Auf diese Weise gibt das getCategory() korrekt null und damit auch das übergebene #{row.category} zurück.

    
BalusC 10.08.2015, 12:46
quelle

Tags und Links