[英]Primefaces Datatable doesnt update selected rows
我有一個簡單的問題。 我有一個Primefaces數據表。 當用戶單擊一行時,我希望更新輔助bean中的選定行屬性。 如果提交了Datatable所在的表單,則可以實現這一點,但我希望它是異步發生的。 我已經在這里閱讀了關於這個問題的各種問題,但仍然無法找到解決方案。
這是一個展示問題的小例子:
測試JSF頁面:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<p:dataTable var="v" value="#{test.values}" selectionMode="multiple"
selection="#{test.selectedValue}" rowKey="#{v.value}" >
<p:column headerText="Test">
<h:outputText value="#{v.value}" />
</p:column>
</p:dataTable>
</h:body>
支持Bean:
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.stack.Stack;
@ManagedBean
@ViewScoped
public class Test
{
private Value[] selectedValues;
public List<Value> getValues()
{
List<Value> retVal = new ArrayList<Value>();
retVal.add(new Value("a"));
retVal.add(new Value("b"));
return retVal;
}
public Value[] getSelectedValues() {
return selectedValues;
}
public void setSelectedValues(Value[] selectedValues) {
this.selectedValues = selectedValues;
}
}
他們使用的簡單POJO:
public class Value {
private String value;
public Value(String value)
{
this.value = value;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
}
根據回復,我更新了Datatable,如下所示:
<p:dataTable id="dt" var="v" value="#{test.values}" selectionMode="multiple"
selection="#{test.selectedValues}" rowKey="#{v.value}" >
<p:column headerText="Test">
<h:outputText value="#{v.value}" />
</p:column>
<p:ajax event="rowSelect"/>
<p:ajax event="rowUnselect" />
</p:dataTable>
然而,這仍然無法調用setter setSelectedValues(); 我讓他們也說:
<p:ajax event="rowSelect" update="@this" />
<p:ajax event="rowUnselect" update="@this" />
這只在點擊一行時調用了getter。 有任何想法嗎?
您可以在<p:ajax>
使用rowSelect
事件。
<p:dataTable ...>
...
<p:ajax event="rowSelect" />
</p:dataTable>
然而,這在這種背景下沒有多大意義。 如果你想在它上面掛一個listener
或update
屬性,那就更有意義了。 例如
<p:dataTable ...>
...
<p:ajax event="rowSelect" update="menu" />
</p:dataTable>
如果你想掛鈎取消選擇行,請添加另一個掛在rowUnselect
上的rowUnselect
:
<p:dataTable ...>
...
<p:ajax event="rowSelect" />
<p:ajax event="rowUnselect" />
</p:dataTable>
<p:dataTable>
所有可用ajax行為事件 只需在數據表中添加<p:ajax event="rowSelect" />
<p:dataTable selection="#{customerView.selectedEntity}" selectionMode="single">
<p:ajax event="rowSelect" />
<!--more code-->
</p:dataTable>
這將在您的支持bean中調用setSelectedEntity(),因此您可以在actionListener觸發時設置它
如果要從數據表格外部調用actionListener(不提交值),這非常有用
我相信你的陳述“在提交表格時起作用”是解決方案。
我有一個類似的問題,我的頁面有多個面板,第一個面板是人員列表,一旦選擇某人,詳細信息將在以下面板中加載。
所以我的rowSelect監聽器正在觸發,但我的bean總是為我的選擇而為null。 僅供參考,我的rowSelect Listener更新了ap:outputPanel,它包裝了我的細節面板。 僅當選擇不為空時才會呈現我的詳細信息面板。
我只是用h:form包裝了數據表,一切都開始工作,只需選擇一行。
現在我使用Spring,Session Scoped Component為我的bean提供數據列表和選擇,並使用Spring singleton Component為我的控制器進行rowSelect操作。 但它應該仍然適用於你的例子。
<p:column headerText="Test">
<h:outputText value="#{v.value}" />
</p:column>
刪除h:outputText標記,使用如下
<p:column headerText="Test">
#{v.value}
</p:column>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.