Ich habe eine Datentabelle mit rowedit. Eine Spalte meiner Tabelle ist eine Zelle mit einer Listbox in, die Elemente der Listbox werden dynamisch abgerufen (abhängig vom Wert in einer anderen Zelle) Ich verwende rowEditInit, um das selectedrow Element zu setzen. Und ich möchte die Listbox aktualisieren, um die korrekten Werte abzurufen. Das funktioniert nicht. Wenn ich das tue
%Vor%Wenn ich dann auf das Stiftsymbol klicke, kann ich sehen, wie die Zeile in den Bearbeitungsmodus wechselt und die Listbox-Elemente retrahiert. Aber es kehrte direkt in den Nicht-Editiermodus zurück.
Aber wenn ich das tue
%Vor%Wenn Sie dann auf das Stiftsymbol klicken, wird die Zeile in den Bearbeitungsmodus versetzt. Es wird jedoch kein Aufruf zum Abrufen der Listenfeldelemente ausgeführt. Meine gues ist, es löst das Update auf rmactionenumid nicht aus.
Irgendwelche Ideen?
Roel
Hier ist mein JSF-Code
%Vor%
und hier ist mein Java-Bean-Code
%Vor%Ich benutze PF3.5
Dies schlägt fehl, weil update="rmactionenumid"
in diesem Konstrukt relativ zur Tabelle selbst und nicht zur aktuellen Tabellenzeile steht.
Grundsätzlich sucht es nach einer Komponente mit der Client-ID formId:tableId:rmactionenumid
anstelle von z. die zweite Zeile formId:tableId:1:rmactionenumid
. Technisch gesehen sollte <p:ajax>
in <p:column>
platziert werden, aber dies funktioniert nicht für rowEditInit
event.
Sie müssten Ihre eigene update
-Kunden-ID basierend auf der UIData
-Komponente erstellen, die als RowEditEvent
-Argument verfügbar ist, und die zusammengesetzte Client-ID zu PartialViewContext#getRenderIds()
.
Entfernen Sie also <p:ajax update>
und erweitern Sie die Methode onUpdate()
wie folgt:
Entspricht der Antwort von BalusC:
Da Sie Primefaces 3.5 verwenden, können Sie alternativ die Hilfsklassen ComponentUtils und RequestContext verwenden:
%Vor%macht dasselbe wie das von BalusC gepostete Snippet.
Oh mein Gott, es hat lange gedauert, bis ich das herausgefunden habe. BalusC ist wie immer tot auf dem Geld, aber die Sache, die mir entging, war, dass die Aktualisierung einer Datatable nicht alle ihre Kinder aktualisiert, wie ich erwartet hatte. Beim Aktualisieren der Tabelle werden die Zeilen tatsächlich aktualisiert (gelöschte Zeilen im zugrunde liegenden Modell verschwinden) und Zeilen neu angeordnet, wenn das zugrunde liegende Modell neu angeordnet wurde. Werte in outputText-Widgets in CellEditor-Containern werden jedoch mit Ausnahme der bearbeiteten Version nicht aktualisiert, sofern Sie nicht angeben Ein <p:ajax />
-Tag an diejenigen, die Sie aktualisieren möchten, was in meinem Fall alle von ihnen war. Ich vermute, es gab eine Design-Annahme, dass, wenn ein CellEditor einen Ajax-Aufruf einleitete, der Datatable-Elternteil nur die bearbeitete Kind-Zelle aktualisieren würde. Ich habe nie verstanden, warum ein CellEditor sowohl einen InputText als auch einen OutputText benötigt, um zu funktionieren.
Dies führte zu horrenden Problemen für mich, wenn mehrere Benutzer gleichzeitig dieselbe Datatable in verschiedenen Sitzungen bearbeiteten. UserA würde eine Bearbeitung vornehmen und eine korrekt aktualisierte Tabelle erhalten, möglicherweise mit den Zeilen in einer anderen Reihenfolge. Dann würde UserB, dessen Datatable veraltet war, eine Bearbeitung vornehmen, und die Bearbeitung würde korrekt in der Datenbank bleiben (weil die Zeile eine eindeutige, versteckte ID hatte), aber die Bearbeitung würde in die falsche Zeile in der Datentabelle gehen ( aber die richtige Spalte), und UserB, selbst nach der Aktualisierung, würde nicht BenutzerA in einer anderen Zelle ändern. Sobald ich das <p:ajax update="datatableID" />
-Tag in den inputText-Body eingefügt habe, hat es richtig funktioniert. Ich hatte immer noch Nebenläufigkeitsprobleme, die ich separat lösen musste, aber zumindest war die Datatable nach den Änderungen korrekt.
BalusC, wenn Sie da draußen sind, korrigieren Sie bitte meine schlechten Annahmen hier.
Ich habe mit dem gleichen Problem konfrontiert. Was Sie tun können, ist Folgendes:
Platzieren Sie ein Protokollierungsobjekt unter Ihrer Aktualisierungsmethode (oder Sie können einfach eine system.out.println schreiben), um zu überprüfen, ob Ihre Methode über die jsf-Seite aufgerufen wird. Wenn ja, schreibe dir dort eine Aktion.
Für mich habe ich überprüft, ob auf meine Methode zugegriffen wird. Und nachdem ich gesehen habe, wurden meine Datensätze immer noch nicht aktualisiert. Was ich getan habe, ist ein neues Objekt der gewünschten Zeile unter der Methode zu erstellen und den Inhalt der Zeilenwerte über getters / setters in mein neues Objekt zu kopieren. Und dann könnte ich meine Zeile aktualisieren. Dieser Weg funktioniert für mich.
Es könnte jemandem helfen. Ich hatte ein ähnliches Problem und habe alles mögliche im Internet versucht. Schließlich habe ich aufgegeben, aber später versehentlich behoben. Das Problem war, dass ich mehrere & lt; h: form & gt; in meiner .xhtml verwendet und die Änderungen wurden aus irgendeinem Grund nicht weitergegeben. Hoffe es hilft jemandem.
Tags und Links listbox datatable jsf primefaces