首页 > 解决方案 > p:dataTable 中未正确返回所选行

问题描述

我有一个用 Primefaces 构建的数据表。它包含一个 "Person" 列表。“Person”是一个只有 1 个 String 属性的 Java 类 - “name”,有没有参数的构造函数,有 1 个 String 参数的构造函数,“name”的 getter 和 setter。表的第一列包含人名。第二列包含一个命令按钮。通过按下它,打开一个对话框。在此对话框中,我想查看所选人员的姓名。JSF 页面是这样的:

<h:form id="personForm" prependId="false">
<p:dataTable id="personEntitiesTable" var="pers" value="#{personView.persons}">
    <p:column headerText="Name">
        <h:outputText value="#{pers.name}" />
    </p:column>          
    <p:column headerText="">             
        <p:commandButton value="Details" type="button" onclick="PF('personDetails').show();" />
        <p:dialog header="Person details" widgetVar="personDetails" modal="true" height="150" >     
            Selected person is "#{pers.name}"
        </p:dialog>
    </p:column>
</p:dataTable>
</h:form>

表的 managedBean 是:

@ManagedBean
@ViewScoped
public classPersonView implements Serializable {
    private List<Person> persons;

    @PostConstruct
    public void init() {
        persons = new ArrayList<Person>();
        persons.add(new Person("John"));
        persons.add(new Person("Mary"));
        persons.add(new Person("James"));
    }

    // getters and setters
}

因此,如果我按下用户“Mary”的“详细信息”按钮,则会打开一个对话框,我希望在其中看到“选定的人是 Mary”消息。问题是无论我在哪一行按下“详细信息”按钮,对话框内的消息都是“选定的人是詹姆斯”。“詹姆斯”是名单上的最后一个人。

标签: jsfprimefacesdatatable

解决方案


由于对话框是在数据表列中声明的,JSF 将为每个表行生成一个对话框。由于它们都使用相同的 widgetVar,最后一个将在 execute 时被调用PF('personDetails').show()

试试这个方法:

  1. 将您的对话框放在数据表之外。
  2. 您的对话框必须使用托管 bean 属性 ( personView.selectedPerson)。
  3. 详细信息按钮必须设置personView.selectedPerson变量pers<f:setPropertyActionListener target="#{personView.selectedPerson}" value="#{pers}"/> 并更新对话框内容。

推荐阅读