我有一个简单的问题。我有一个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。有什么想法吗?
答案 0 :(得分:4)
您可以在rowSelect
中使用<p:ajax>
事件。
<p:dataTable ...>
...
<p:ajax event="rowSelect" />
</p:dataTable>
然而,在这种背景下,这无助于理解。如果你想在其上挂钩listener
或update
属性,那就更有意义了。 E.g。
<p:dataTable ...>
...
<p:ajax event="rowSelect" update="menu" />
</p:dataTable>
如果您想要取消选择行,请添加另一个挂钩rowUnselect
:
<p:dataTable ...>
...
<p:ajax event="rowSelect" />
<p:ajax event="rowUnselect" />
</p:dataTable>
<p:dataTable>
所有可用的ajax行为事件答案 1 :(得分:3)
只需在数据表中添加<p:ajax event="rowSelect" />
<p:dataTable selection="#{customerView.selectedEntity}" selectionMode="single">
<p:ajax event="rowSelect" />
<!--more code-->
</p:dataTable>
这会在你的支持bean中调用setSelectedEntity(),所以你在actionListener触发时设置它
如果你想从数据表格外部调用一个actionListener(它不会提交值),这很有用。
答案 2 :(得分:2)
我相信你的陈述&#34;在提交表格时工作&#34;是解决方案。
我遇到了类似的问题,我的页面有多个面板,第一个面板是人员列表,一旦选择了某个人,就会在以下面板中加载详细信息。
所以我的rowSelect监听器正在触发,但我的bean总是为我的选择空。仅供参考,我的rowSelect Listener更新了一个p:outputPanel,它包装了我的细节面板。仅当选择不为空时才会呈现我的详细信息面板。
我只是用h:form包装数据表,只需选择一行就可以开始工作了。
现在我使用Spring,Session Scoped Component为我的bean提供数据列表和选择,并使用Spring singleton Component为我的控制器进行rowSelect操作。但它应该仍然适用于你的例子。
答案 3 :(得分:-2)
<p:column headerText="Test">
<h:outputText value="#{v.value}" />
</p:column>
删除h:outputText标记,使用如下
<p:column headerText="Test">
#{v.value}
</p:column>