JSF/Primefaces:更新对话框不工作
JSF/Primefaces: Update Dialog not working
我有一个 dataTable
,每个 row
有一个 commandButton
。如果我单击 commandButton
,一个 dialog
应该打开,其中包含所选行的更多详细信息。
<p:commandButton
update="mainForm:myDialog"
action="#{bean.fetchData(user)}"
oncomplete="PF('myDialog').show();"
title="Details"
/>
这是bean
中的fetchData()
方法:
public void fetchData(user) {
this.events = this.db.fetchDataForUser(user);
}
对话框:
<p:dialog
header="Details"
id="myDialog"
modal="true"
resizable="false"
width="1000px"
height="700px"
>
<p:dataTable
value="#{bean.events}"
var="event"
>
<p:column
headerText="Event"
style="vertical-align: top; text-align: center;"
width="auto"
>
<h:outputText
value="#{event.eventType}"
/>
</p:column>
....
</p:dataTable>
</p:dialog>
这个想法是,当 commandButton
被按下时,fetchData()
被执行并设置 events
列表。之后 dialog
打开并显示 events
。
但它不起作用。
在调用 fetchData
之前,getter
会执行多次。
然后 fetchData()
按预期被调用并设置 events
列表。但是当 events
的 getter
再次被调用时,events
仍然是 null
。
按照这些步骤并检查来自 PrimeFaces 展示柜的示例
- 首先,将一个对象放入您的 bean 中作为 selectedUser。
- 然后,您必须设置selectedUser。您可以使用 setPropertyActionListener。
然后,您可以在对话框中调用您的方法。你的方法将是这样的
public void fetchData() {
this.events = this.db.fetchDataForUser(this.selectedUser);
}
您可以在 PrimeFaces - Showcase - DataTable - Selection 中找到解决方案。
<p:dataTable id="basicDT" var="car" value="#{dtSelectionView.cars1}">
<f:facet name="header">
Basic
</f:facet>
<p:column headerText="Id">
<h:outputText value="#{car.id}" />
</p:column>
<p:column headerText="Year">
<h:outputText value="#{car.year}" />
</p:column>
<p:column headerText="Brand">
<h:outputText value="#{car.brand}" />
</p:column>
<p:column headerText="Color">
<h:outputText value="#{car.color}" />
</p:column>
<p:column style="width:32px;text-align: center">
<p:commandButton update=":form:carDetail" oncomplete="PF('carDialog').show()" icon="pi pi-search" title="View">
<f:setPropertyActionListener value="#{car}" target="#{dtSelectionView.selectedCar}" />
</p:commandButton>
</p:column>
</p:dataTable>
我们必须用setPropertyActionListener设置选中的对象,然后我们可以根据它在对话框中获取数据。
<p:dialog header="Car Info" widgetVar="carDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false">
<p:outputPanel id="carDetail" style="text-align:center;">
<p:panelGrid columns="2" rendered="#{not empty dtSelectionView.selectedCar}" columnClasses="label,value">
<f:facet name="header">
<p:graphicImage name="demo/images/car/#{dtSelectionView.selectedCar.brand}-big.gif"/>
</f:facet>
<h:outputText value="Id:" />
<h:outputText value="#{dtSelectionView.selectedCar.id}" />
<h:outputText value="Year" />
<h:outputText value="#{dtSelectionView.selectedCar.year}" />
<h:outputText value="Color:" />
<h:outputText value="#{dtSelectionView.selectedCar.color}" style="color:#{dtSelectionView.selectedCar.color}"/>
<h:outputText value="Price" />
<h:outputText value="$#{dtSelectionView.selectedCar.price}" />
</p:panelGrid>
</p:outputPanel>
</p:dialog>
豆中,
@Named("dtSelectionView")
@ViewScoped
public class SelectionView implements Serializable {
private Car selectedCar;
public Car getSelectedCar() {
return selectedCar;
}
public void setSelectedCar(Car selectedCar) {
this.selectedCar = selectedCar;
}
}
我有一个 dataTable
,每个 row
有一个 commandButton
。如果我单击 commandButton
,一个 dialog
应该打开,其中包含所选行的更多详细信息。
<p:commandButton
update="mainForm:myDialog"
action="#{bean.fetchData(user)}"
oncomplete="PF('myDialog').show();"
title="Details"
/>
这是bean
中的fetchData()
方法:
public void fetchData(user) {
this.events = this.db.fetchDataForUser(user);
}
对话框:
<p:dialog
header="Details"
id="myDialog"
modal="true"
resizable="false"
width="1000px"
height="700px"
>
<p:dataTable
value="#{bean.events}"
var="event"
>
<p:column
headerText="Event"
style="vertical-align: top; text-align: center;"
width="auto"
>
<h:outputText
value="#{event.eventType}"
/>
</p:column>
....
</p:dataTable>
</p:dialog>
这个想法是,当 commandButton
被按下时,fetchData()
被执行并设置 events
列表。之后 dialog
打开并显示 events
。
但它不起作用。
在调用 fetchData
之前,getter
会执行多次。
然后 fetchData()
按预期被调用并设置 events
列表。但是当 events
的 getter
再次被调用时,events
仍然是 null
。
按照这些步骤并检查来自 PrimeFaces 展示柜的示例
- 首先,将一个对象放入您的 bean 中作为 selectedUser。
- 然后,您必须设置selectedUser。您可以使用 setPropertyActionListener。
然后,您可以在对话框中调用您的方法。你的方法将是这样的
public void fetchData() { this.events = this.db.fetchDataForUser(this.selectedUser); }
您可以在 PrimeFaces - Showcase - DataTable - Selection 中找到解决方案。
<p:dataTable id="basicDT" var="car" value="#{dtSelectionView.cars1}">
<f:facet name="header">
Basic
</f:facet>
<p:column headerText="Id">
<h:outputText value="#{car.id}" />
</p:column>
<p:column headerText="Year">
<h:outputText value="#{car.year}" />
</p:column>
<p:column headerText="Brand">
<h:outputText value="#{car.brand}" />
</p:column>
<p:column headerText="Color">
<h:outputText value="#{car.color}" />
</p:column>
<p:column style="width:32px;text-align: center">
<p:commandButton update=":form:carDetail" oncomplete="PF('carDialog').show()" icon="pi pi-search" title="View">
<f:setPropertyActionListener value="#{car}" target="#{dtSelectionView.selectedCar}" />
</p:commandButton>
</p:column>
</p:dataTable>
我们必须用setPropertyActionListener设置选中的对象,然后我们可以根据它在对话框中获取数据。
<p:dialog header="Car Info" widgetVar="carDialog" modal="true" showEffect="fade" hideEffect="fade" resizable="false">
<p:outputPanel id="carDetail" style="text-align:center;">
<p:panelGrid columns="2" rendered="#{not empty dtSelectionView.selectedCar}" columnClasses="label,value">
<f:facet name="header">
<p:graphicImage name="demo/images/car/#{dtSelectionView.selectedCar.brand}-big.gif"/>
</f:facet>
<h:outputText value="Id:" />
<h:outputText value="#{dtSelectionView.selectedCar.id}" />
<h:outputText value="Year" />
<h:outputText value="#{dtSelectionView.selectedCar.year}" />
<h:outputText value="Color:" />
<h:outputText value="#{dtSelectionView.selectedCar.color}" style="color:#{dtSelectionView.selectedCar.color}"/>
<h:outputText value="Price" />
<h:outputText value="$#{dtSelectionView.selectedCar.price}" />
</p:panelGrid>
</p:outputPanel>
</p:dialog>
豆中,
@Named("dtSelectionView")
@ViewScoped
public class SelectionView implements Serializable {
private Car selectedCar;
public Car getSelectedCar() {
return selectedCar;
}
public void setSelectedCar(Car selectedCar) {
this.selectedCar = selectedCar;
}
}