Siehe JSF dynamisch generierte IDs basierend auf Iterationsindex

8

In JSF generieren <ui:repeat/> und ähnliche Komponenten wie PrimeFaces <p:dataTable/> dynamische IDs für Unterkomponenten basierend auf dem Iterationsindex, d. h.:

%Vor%

erzeugt etwas wie dieses:

%Vor%

Alle Elemente haben eindeutig eine eindeutige Kunden-ID. Ich habe absichtlich die <tr/> , <td/> , etc. übersprungen.

Also, <p:ajax ... update=":table:name"/> bezieht sich auf alle Namen in der Tabelle und es funktioniert gut, <p:ajax ... update=":table:#{someDesiredIndex}:name"/> scheitert mit einer Nachricht ähnlich wie SEVERE: javax.faces.FacesException: Cannot find component with identifier ":table:0:name" in view. event, obwohl ich bestätigen kann, dass die Komponente im Markup existiert. Ist das nicht möglich?

Ich laufe auf GlassFish 3.1.2 und Mojarra 2.1.6, falls es relevant ist.

    
rdcrng 16.04.2013, 17:20
quelle

1 Antwort

11

Es ist tatsächlich nicht in der JSF-Komponentenstruktur vorhanden, da es von UIViewRoot#findComponent() . Es existiert nur in der generierten HTML-Ausgabe. Es gibt nur eine <h:outputText id="name"> in der JSF-Komponentenstruktur, nicht mehrere, wie Sie es erwartet haben. Es wurde nur mehrfach beim Erstellen der HTML-Ausgabe wiederverwendet. Im besten Fall können Sie die physische Komponente nach table:name erhalten, aber dies ist wiederum nicht in der HTML-DOM-Struktur vorhanden, so dass die document.getElementById() bei der Ausführung der Ajax-Aktualisierung fehlschlagen würde.

Um die konkrete Funktionsanforderung trotzdem zu erreichen, müssen Sie grundsätzlich eine physische vorhandene Komponente haben, die die Zeile im JSF-Komponentenbaum darstellt. Sie können sie in einer Schleife erstellen, wenn Sie anstelle eines View-Rendering-Zeittags ein View-Build-Tag verwenden, z. B. JSTL <c:forEach> .

%Vor%

Dies wird physikalisch mehrere Komponenten in der JSF-Komponentenstruktur erzeugen und diese werden wie folgt gerendert:

%Vor%

Und Sie können sie über z.B. update=":table_#{someDesiredIndex}_name" .

Siehe auch:

Update : seit Mojarra 2.2.5 validiert% ce_de% die Client-ID nicht mehr und der Renderer kann durchlaufende Komponenten durchlaufen, um die richtige Iterationsrunde zum Rendern zu finden . Also sollte der Verweis auf den Iterationsindex in <f:ajax> genau so funktionieren. Es funktioniert nur noch nicht in aktuellen MyFaces 2.2.7 / PrimeFaces 5.1-Versionen, aber es wird erwartet, dass sie es in einer zukünftigen Version aufholen werden.

    
BalusC 16.04.2013, 17:58
quelle

Tags und Links