In JSF generieren <ui:repeat/>
und ähnliche Komponenten wie PrimeFaces <p:dataTable/>
dynamische IDs für Unterkomponenten basierend auf dem Iterationsindex, d. h.:
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.
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>
.
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"
.
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.
Tags und Links jsf-2