jsf - 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”消息。问题是无论我在哪一行按下“详细信息”按钮,对话框内的消息都是“选定的人是詹姆斯”。“詹姆斯”是名单上的最后一个人。
解决方案
由于对话框是在数据表列中声明的,JSF 将为每个表行生成一个对话框。由于它们都使用相同的 widgetVar,最后一个将在 execute 时被调用PF('personDetails').show()
。
试试这个方法:
- 将您的对话框放在数据表之外。
- 您的对话框必须使用托管 bean 属性 (
personView.selectedPerson
)。 - 详细信息按钮必须设置
personView.selectedPerson
变量pers
:<f:setPropertyActionListener target="#{personView.selectedPerson}" value="#{pers}"/>
并更新对话框内容。
推荐阅读
- class - 创建其类型变量类的实例的 TypeScript 泛型类?
- swift - 需要快速检索用户坐标
- laravel - Laravel - 使用标题键创建 API
- angular - End 等于 Angular 4
- jquery - 分析事件跟踪适用于控制台但不适用于 WP
- ruby-on-rails - 如何从布局文件中渲染局部视图?
- python - Python 生成器代替类对象作为强化学习环境
- html - 如何在html中创建一个自更新列表?
- swift - 如何使用 PureLayout 将标签分开
- javascript - JavaScript Web API 是否在与调用堆栈线程不同的线程上运行?