3

我有一个简单的问题。我有一个 Primefaces 数据表。当用户单击一行时,我希望更新支持 bean 中的 selected 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;
    }
}

根据回复,我已经像这样更新了数据表:

    <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

4 回答 4

4

您可以rowSelect<p:ajax>.

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

然而,在这种情况下,这几乎没有意义。如果您还想在其上附加一个listener或一个update属性,那会更有意义。例如

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

如果您还想取消选择行,请添加另一个挂钩rowUnselect

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

也可以看看:

于 2012-11-19T15:36:42.317 回答
3

只需<p:ajax event="rowSelect" />在您的数据表中添加

<p:dataTable selection="#{customerView.selectedEntity}" selectionMode="single">
    <p:ajax event="rowSelect" />
<!--more code-->
</p:dataTable>

这将在您的支持 bean 中调用 setSelectedEntity(),因此您可以在 actionListener 触发时设置它

如果您想从数据表表单(不会提交值)外部调用 actionListener,这很有用

于 2012-11-19T15:39:52.450 回答
2

我相信您的声明“提交表单时有效”是解决方案。

我有一个类似的问题,我的页面有多个面板,第一个面板是人员列表,一旦选择某人,详细信息就会加载到以下面板中。

所以我的 rowSelect 监听器正在触发,但我的 bean 总是有 null 供我选择。仅供参考,我的 rowSelect 侦听器更新了包装我的详细信息面板的 ap:outputPanel。我的细节面板只有在选择不为空时才会渲染。

我只是用 h:form 包装了数据表,一切都开始工作了,只需选择一行。

现在,我为我的 bean 使用 Spring、Session Scoped Component 来容纳数据列表和选择,并为我的控制器使用 Spring 单例组件来进行 rowSelect 操作。但它仍然适用于您的示例。

于 2016-10-05T17:16:41.693 回答
-2
<p:column headerText="Test">
    <h:outputText value="#{v.value}" />
</p:column>

去掉h:outputText标签,使用如下

<p:column headerText="Test">
    #{v.value}
</p:column>
于 2013-04-19T09:27:40.630 回答