Primefaces datatable datatable aktualisieren
Ich habe ein problem mit primefaces datatables. Ich habe eine datatable mit einige Einträge und eine Spalte mit einem Knopf innen. Wenn die Taste gedrückt wird, wird ein popup geöffnet wird mit einer anderen datatable. Die Einträge in der zweiten Datentabelle sind abhängig von der Zeile, in der die Taste gedrückt wird.
<!-- first datatable -->
<h:form id="list">
<p:dataTable id="list1" var="item" value="#{bean1.itemlist}"
rowKey="#{item.id}" selection="#{bean1.selectedItem}"
selectionMode="single">
<p:column headerText="ID">
<h:outputText value="#{item.id}" />
</p:column>
...
<p:column headerText="Edit Entries">
<p:commandButton value="Edit Entries"
actionListener="#{bean2.updateEntries(item)}" ajax="true"
oncomplete="PF('edit_entries').show()" />
</p:column>
</p:dataTable>
<!-- Second datatable in the popup -->
<p:dialog header="Edit Entries" widgetVar="edit_entries" modal="true"
resizable="false">
<p:dataTable id="list2" var="entry"
value="#{bean2.entriesList}" rowKey="#{entry.id}"
selection="#{bean2.selectedEntry}" selectionMode="single">
<p:column headerText="Entry Number">
<h:outputText value="#{entry.number}" />
</p:column>
</p:dataTable>
<f:facet name="footer">
<p:commandButton value="Save" oncomplete="PF('edit_entries').hide()" />
</f:facet>
</p:dialog>
</form>
Bean2
public void updateEntries(Item selectedItem) {
this.entriesList = this.entriesQuery.getAllEntriesByItemID(selectedItem.getId());//db query could take some time
System.out.println("entrieslist size: " + this.entriesList.size()); //prints the correct size
}
Das problem ist, dass es keine Einträge in das popup-datatable-es gibt zwar einige in der Liste nach der db-Abfrage.
Irgendwelche Ideen, wie man diesen Fehler beheben kann?
Vielen Dank im Voraus!
UPDATE 1:
<!-- first datatable -->
<h:form id="list">
<p:dataTable id="list1" var="item" value="#{bean1.itemlist}"
rowKey="#{item.id}" selection="#{bean1.selectedItem}"
selectionMode="single">
<p:column headerText="ID">
<h:outputText value="#{item.id}" />
</p:column>
...
<p:column headerText="Edit Entries">
<p:commandButton value="Edit Entries" update=":dialogUpdateEntries"
actionListener="#{bean2.updateEntries(item)}" ajax="true"
oncomplete="PF('edit_entries').show()" />
</p:column>
</p:dataTable>
</h:form>
<!-- Second datatable in the popup -->
<p:dialog header="Edit Enries" id="dialogUpdateEntries" widgetVar="edit_entries" modal="true"
resizable="false">
<h:form id="formEntriesList">
<p:dataTable id="list2" var="entry"
value="#{bean2.entriesList}" rowKey="#{entry.id}"
selection="#{bean2.selectedEntry}" selectionMode="single">
<p:column headerText="Entry Number">
<h:outputText value="#{entry.number}" />
</p:column>
</p:dataTable>
<f:facet name="footer">
<p:commandButton value="Save" oncomplete="PF('edit_entries').hide()" />
</f:facet>
</form>
</p:dialog>
- Sie sind eigentlich nicht zu ändern, die Frage in der Weise, dass die Antworten, die sich mit dieser unvereinbar.
- sorry, ich habe es behoben
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist in der Tat nicht die Aktualisierung der Daten-Tabelle in das Dialogfeld ein. JSF nicht automatisch die Aktualisierung der Ansicht auf den Wechsel des Modells, müssen Sie explizit sagen, die Ansicht zu tun. Sie können die Verwendung der ajax-action-Komponente
update
- Attribut für diesen. Dies dauert eine JSF-client-ID gefunden werden kann, indem Regeln, wie in diesem Zusammenhang zu beantworten: Wie Sie herausfinden, client-ID der Komponente für ajax-update/render? Kann nicht finden, die Komponente mit dem Ausdruck "foo" referenziert von "bar".Angesichts der markup, wie gezeigt, in der Frage, dass Sie
Allerdings gibt es ein weiteres potenzielles problem. Sie sind mit
<p:dialog modal="true">
innen ein Formular anstatt der dialog seine eigene form. Auf diese Weise wird das Dialogfeld möglicherweise nicht verfügbar in den HTML-DOM-Baum als JavaScript (das verantwortlich für den Umgang mit ajax Zeugs) erwarten würde, um es zu finden. Geben Sie den dialog zur eigenen form sollte das beheben dieser Sache. Es wird auch fix auf mögliche zukünftige Probleme mit aufrufen von Aktionen von innen den dialog behandelt in diesem Zusammenhang die Frage: <p:commandbutton> action funktioniert nicht innen, <p:dialog>.#{bean2.entriesList}
ist offenbar leer.@Named
ohne einen gültigen Bereich.@Named
und die Bohne war auch aufgeführt imfaces-config.xml
. Jetzt habe ich gerade ersetzt die@Named
mit@Managed
- und es funktionierte. Vielen Dank!faces-config.xml
sollte nicht notwendig sein, JSF 2.x. Dies ist ein überbleibsel aus JSF 1.x. Sie sollten in der Lage sein zu verwenden@Named
Sie nur haben um sicherzustellen, dass Sie importieren den richtigen Rahmen, z.B.@javax.faces.view.ViewScoped
und somit nicht@javax.faces.bean.ViewScoped
.Versuchen Sie
update="list2"
um Einträge zu Editieren Befehl-Taste (auchupdate="@widgetVar(edit_entries)"
sollte funktionieren).Wenn, weil auf der Seite layout und die Struktur, Sie kann nicht als Ziel die zweite datatable mit oben genannten Vorschläge, dann fügen Sie
styleClass="tList2"
zur zweiten Tabelle, und aktualisieren Sie es mitupdate="@(.tList2)"
auf die Schaltfläche "Bearbeiten".styleClass
?updateEntries()
genannt wird? Wenn nicht, fügen Sieprocess="@this"
auf die Schaltfläche "Bearbeiten".