簡単な問題があります。PrimefacesDatatableを持っています。ユーザーが行をクリックすると、バッキングBeanで選択されたrowsプロパティが更新されます。これは、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>
バッキングビーン:
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>
ただし、これでもセッターsetSelectedValues()の呼び出しは失敗します。私は彼らにも言わせました:
<p:ajax event="rowSelect" update="@this" />
<p:ajax event="rowUnselect" update="@this" />
そして、これは行がクリックされたときにのみゲッターを呼び出しました。何か案は?