Primefaces dataTable sofortige Zeile Auswahl nicht funktioniert
Arbeite ich mit Primefaces 3.5, Spring 3.2, JSF 2.2 und Apache ist mein server.
Mein problem ist, dass immer, wenn ich Sie auf die Zeile, die Zeile select-Ereignis wird nie ausgelöst, in meiner backing-bean und meinem Shop-details-Bedienfeld nie aktualisiert.
Meine backing-bean im request scope und enthält onRowSelect Methode.
Jedoch wenn ich mein backing bean zu Sitzungen Umfang(es erfordert einige änderungen in der backing-bean), instant Zeile die Selektion funktioniert.
Für die Einfachheit meiner Frage, ich habe meine modifizierten code, um nur den relevanten Teil. In meinem param, für den Willen des Tests habe ich nur bestehende Kunden mit ID 35 in meiner test-Seite.
Hier ist mein dialog.xhtml
<h:form id="customerListingsForm">
<p:dialog id="manageStoresDialog"
header="Manage #{manageStoreBean.store.owner.name}'s Stores"
widgetVar="manageStoresDlg"
modal="true"
resizable="false">
<p:panelGrid id="storePanel" rendered="#{manageStoreBean.owner != null}">
<f:facet name="header">
<p:row>
<p:column>Store Details</p:column>
<p:column>Customer Store List</p:column>
</p:row>
</f:facet>
<p:row>
<p:column>
<p:panelGrid id="storeDetails">
<p:row>
<p:column>Name: </p:column>
<p:column>
<h:inputText value="#{manageStoreBean.store.name}" />
</p:column>
</p:row>
<p:row>
<p:column>Description: </p:column>
<p:column>
<h:inputText value="#{manageStoreBean.store.description}" />
</p:column>
</p:row>
<p:row>
<p:column>Short Code: </p:column>
<p:column>
<h:inputText value="#{manageStoreBean.store.shortCode}" />
</p:column>
</p:row>
<p:row>
<p:column>Owner name:</p:column>
<p:column>
<h:inputText value="#{manageStoreBean.store.owner.name}" readonly="true" />
</p:column>
</p:row>
<p:row>
<p:column>Store Type: </p:column>
<p:column>
<p:selectOneMenu
id="storeTypeSelected"
value="#{manageStoreBean.placeType}"
var="storeType"
style="height:25px"
converter="#{placeTypeConverter}">
<f:selectItems
value="#{manageStoreBean.typeList}"
var="storeTypeItem"
itemLabel="#{storeTypeItem.code}"
itemValue="#{storeTypeItem}"/>
<p:column>#{storeType.description}</p:column>
</p:selectOneMenu>
</p:column>
</p:row>
<p:row>
<p:column>Country: </p:column>
<p:column>
<p:selectOneMenu
id="storeCountrySelected"
value="#{manageStoreBean.country}"
var="country"
style="height:25px"
converter="#{countryConverter}">
<f:selectItems
value="#{manageStoreBean.countryList}"
var="countryItem"
itemLabel="#{countryItem.isoNumericCode}"
itemValue="#{countryItem}"/>
<p:column>#{country.isoNumericCode}</p:column>
</p:selectOneMenu>
</p:column>
</p:row>
<p:row>
<p:column>Localisation: </p:column>
<p:column>
<p:selectOneMenu
id="storeLocalisationSelected"
value="#{manageStoreBean.localisationData}"
var="storeLocal"
style="height:25px"
converter="#{localisationConverter}">
<f:selectItems
value="#{manageStoreBean.localisationList}"
var="local"
itemLabel="#{local.regionCode}"
itemValue="#{local}"/>
<p:column>#{storeLocal.id} - #{storeLocal.regionCode}</p:column>
</p:selectOneMenu>
</p:column>
</p:row>
</p:panelGrid>
</p:column>
<p:column style="width:250px">
<p:dataTable id="stores"
var="store"
value="#{manageStoreBean.storeList}"
rowKey="#{store.id}"
scrollHeight="240"
scrollable="true"
selectionMode="single"
selection="#{manageStoreBean.selectedStore}"
lazy="true">
<p:ajax event="rowSelect" immediate="true"
listener="#{manageStoreBean.onRowSelect}"
update=":customerListingsForm:storeDetails"/>
<p:column headerText="Salon Name">
<h:outputText value="#{store.name}" />
</p:column>
<p:column headerText="ID">
<h:outputText value="#{store.id}" />
</p:column>
</p:dataTable>
</p:column>
</p:row>
</p:panelGrid>
<p:commandButton
value="Save"
action="#{manageStoreBean.saveStore}"
oncomplete="manageStoresDlg.hide()">
<f:param name="storeCustomerId" value="#{manageStoreBean.owner.id}" />
</p:commandButton>
<h:outputText value=" " />
<p:commandButton
value="Close"
oncomplete="manageStoresDlg.hide()"/>
</p:dialog>
<p:commandButton value="Add Store"
oncomplete="manageStoresDlg.show()"
update=":customerListingsForm:manageStoresDialog"
process="@this">
<f:param name="storeCustomerId" value="35" />
</p:commandButton>
</h:form>
Auch ich bin neu in primefaces und web dev, machte aber eine Menge lernen mich selbst, bevor ich dieses Projekt begann.
Ich verbrachte 2 Tage versucht zu verstehen, was falsch und suchte alle web, aber konnte nicht finden keine Lösung. Vielleicht bin ich etwas fehlt oder falsch sicher nicht.
Jede Hilfe wird sehr geschätzt.
InformationsquelleAutor Alexandr Dunaiskiy | 2013-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, Ihre bean-Ansicht beschränkt.
Wenn Sie es verlangen Gültigkeitsbereich, dann sind Sie sagen, JSF, werfen alle Ihre vorhandenen Daten jedes mal, wenn der Benutzer fertig ist mit deinem server. So macht es keinen Sinn zu haben, JSF führen Sie einen listener auf eine vorhandene Seite. Insbesondere, PrimeFaces hat eine Tendenz zu Fehlfunktionen, wenn es auf eine ungerade Reihe von Bereichen.
Siehe auch Unterschied zwischen Ansicht und anforderungsbereich in managed beans
Es ist nicht wirklich ein guter Weg, um es. Sie sollten in der Lage sein zu rufen, eine andere bean, die Sitzung (oder der Anwendung) bereichsbezogene, aber Sie würden versuchen, zu passen, einen quadratischen Pflock in ein rundes Loch. Wenn Sie einen ajax-Ereignis auf einem request-scoped bean, dann ist der einzige Weg, das Ereignis wird aufgerufen ist, wenn Sie es schafft eine völlig neue bean, das heißt, Sie können nicht auf irgendwelche Ihrer Daten. Und ruft eine Zeile select-Ereignis auf leeren Daten macht keinen Sinn.
ja, Sie sind richtig. wenn ich meine Kunden-ID in bean Konstruktor(für die sake-Prüfung), die instant-Reihe, wie die Selektion funktioniert, wie Sie weiß, wie das nachladen der Tabelle wieder. Also ich bin ein bisschen verwirrt? Warum würden Sie brauchen, um neu zu laden Tabelle wieder in Ordnung zu Auswahl?
Denn das ist, wie du es gesagt hast, zu Verhalten, wenn Sie sagte, es sei request-scoped. 🙂 Wenn Sie etwas machen, request-scoped, die server-side-code wird sofort löschen Sie alle Informationen, die er hat, sobald es fertig ist mit jeweils separate HTTP-Anforderung. Versuchen Sie bei diesem Ablauf: - Benutzer-Anfrage, die Seite zu laden (HTTP-request) - Server mit HTTP-request, so löscht er die bean - Benutzer eine Zeile auswählt. Dies schafft einen AJAX-request. - Server erstellt eine neue bean auf den Umgang mit den Antrag. Diese Bohne hat keine der Informationen von der ersten Bohne.
Ok, ich sehe. Dank für das clearing einige Sachen für mich. Ich bin immer noch lernen, all dieses Zeug. Gibt es trotzdem, wie kann ich pass param mit meiner Tabelle, so dass, wenn der neue Antrag ist ausgeführt, Zeile Auswahl es wird auch(in meinem Fall) die Kunden-id?
InformationsquelleAutor patstuart
Durch die Suche eine Menge Sachen über das internet kam ich zu dem Schluss, dass datatable funktioniert nicht sehr gut mit backing bean im request scope, wenn die Tabelle geladen wird mithilfe der dynamischen argument. Das ist sehr schade. Ich sehe keine andere option, aber für die Umsetzung viewscope im Frühjahr für meine Bohnen.
InformationsquelleAutor Alexandr Dunaiskiy