Jsf p:dataTable中未正确返回所选行

Jsf p:dataTable中未正确返回所选行,jsf,primefaces,datatable,Jsf,Primefaces,Datatable,我有一个用Primefaces构建的数据表。它包含一个“人”的列表。“Person”是一个Java类,只有一个字符串属性——“name”,它的构造函数没有参数,构造函数有一个字符串参数,“name”的getter和setter。表的第一列包含人名。第二列包含commandButton。按此键将打开一个对话框。在此对话框中,我想查看所选人员的姓名。 JSF页面如下所示: <h:form id="personForm" prependId="false"> <p:dataTable

我有一个用Primefaces构建的数据表。它包含一个“人”的列表。“Person”是一个Java类,只有一个字符串属性——“name”,它的构造函数没有参数,构造函数有一个字符串参数,“name”的getter和setter。表的第一列包含人名。第二列包含commandButton。按此键将打开一个对话框。在此对话框中,我想查看所选人员的姓名。 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>

所选人员为“#{pers.name}”
表的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
}
@ManagedBean
@视域
公共类PersonView实现可序列化{
私人名单人员;
@施工后
公共void init(){
persons=newarraylist();
人员。添加(新人员(“约翰”);
人员。添加(新人员(“玛丽”);
人员。添加(新人员(“詹姆斯”);
}
//接球手和接球手
}

因此,如果我按下用户“Mary”的“Details”按钮,就会打开一个对话框,我希望看到消息“Selected person is Mary”。问题是,无论我在哪一行按下“详细信息”按钮,对话框中的消息都是“所选人员是詹姆斯”。“James”是列表中的最后一个人。

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

试着这样做:

  • 将对话框置于datatable之外
  • 您的对话框必须使用托管bean属性(
    personView.selectedPerson
  • 详细信息按钮必须设置
    personView。使用
    pers
    变量选择person
    并更新对话框内容

  • 对于n个人,您将得到n个对话框,每个对话框都具有wiedgetVar
    personDetails
    。显然最后一个赢了。WidgetVars在呈现的HTML文档上必须是唯一的。而且您根本没有使用dataTable的选择机制。您的标题和文本表明您正在尝试实现以下目标:1:将对话框置于datatable之外,2:这是widgetvar中其他问题的重复,不是唯一的,最后一个问题在这里获胜。让我找到重复项,它是一个“改进”,但没有解释OP遇到问题的原因…我在PersonView中添加了属性,对于p:commandButton标记,我还添加了update=“:personDetails”。问题仍然存在。是否确实已将对话框声明为不在datatable中?否则JSF将为每个表行生成一个对话框。因为它们都使用相同的widgetVar,所以在执行
    PF('personDetails')时将调用最后一个。show()
    @CatalinVladu检查您的按钮是否是这样的:我应用了这里所说的内容,并且有效: