Primefaces Datatable不会更新选定的行

时间:2012-11-19 15:27:24

标签: jsf primefaces

我有一个简单的问题。我有一个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。有什么想法吗?

4 个答案:

答案 0 :(得分:4)

您可以在rowSelect中使用<p:ajax>事件。

<p:dataTable ...>
    ...
    <p:ajax event="rowSelect" />
</p:dataTable>

然而,在这种背景下,这无助于理解。如果你想在其上挂钩listenerupdate属性,那就更有意义了。 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>

另见:

答案 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>