Jsf p:dataTable中未正确返回所选行
我有一个用Primefaces构建的数据表。它包含一个“人”的列表。“Person”是一个Java类,只有一个字符串属性——“name”,它的构造函数没有参数,构造函数有一个字符串参数,“name”的getter和setter。表的第一列包含人名。第二列包含commandButton。按此键将打开一个对话框。在此对话框中,我想查看所选人员的姓名。 JSF页面如下所示: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
<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个对话框,每个对话框都具有wiedgetVarpersonDetails
。显然最后一个赢了。WidgetVars在呈现的HTML文档上必须是唯一的。而且您根本没有使用dataTable的选择机制。您的标题和文本表明您正在尝试实现以下目标:1:将对话框置于datatable之外,2:这是widgetvar中其他问题的重复,不是唯一的,最后一个问题在这里获胜。让我找到重复项,它是一个“改进”,但没有解释OP遇到问题的原因…我在PersonView中添加了属性,对于p:commandButton标记,我还添加了update=“:personDetails”。问题仍然存在。是否确实已将对话框声明为不在datatable中?否则JSF将为每个表行生成一个对话框。因为它们都使用相同的widgetVar,所以在执行PF('personDetails')时将调用最后一个。show()
@CatalinVladu检查您的按钮是否是这样的:我应用了这里所说的内容,并且有效: