我尝试使用行计数构建<p:dataTable>
,但由于某种原因,它只显示每行中的第一个索引。这是我的代码:
<p:dataTable value="#{personBean.personListAsModel}" var="person">
<p:column headerText="No">
<h:outputText value="#{personBean.personListAsModel.rowIndex + 1}"/>
</p:column>
<p:column headerText="Last name">
<h:outputText value="#{person.lastName}"/>
</p:column>
<p:column headerText="First name">
<h:outputText value="#{person.firstName}"/>
</p:column>
</p:dataTable
@ManagedBean
@ViewScoped //The scope doesn't matter (I think)
public class PersonBean () {
private List<Person> personList;
public PersonBean() {
personList = new ArrayList<>();
// populate the list with Person objects (it's just a POJO with first and last name)
}
// get/set for personList
public ListDataModel<Person> getPersonListAsModel() {
return new ListDataModel(personList);
}
}
但是当我显示表格时,结果是这样的:
| No | Last Name | First Name |
|----|-----------|------------|
| 1 | Smith | John |
| 1 | Perez | Juan |
| 1 | Stallman | Richard |
| 1 | Gosling | James |
| 1 | Cagatay | Civici |
| 1 | Doe | Jane |
我有什么遗失的吗?任何指导/帮助表示赞赏。提前致谢
答案 0 :(得分:2)
行索引存储在DataModel
中,默认为-1
。您正在使用getter方法创建新的ListDataModel
实例。 UIData
组件在每次迭代时调用getter方法。
停止在getter方法中创建模型和执行其他业务逻辑。
由于您的bean是视图作用域且DataModel
不可序列化,因此最好是延迟加载它。
@ViewScoped
public class PersonBean implements Serializable {
private List<Person> personList;
private transient DataModel<Person> personListAsModel;
@EJB
private PersonService personService;
@PostConstruct
public void init() {
personList = personService.list();
}
public ListDataModel<Person> getPersonListAsModel() {
if (personListAsModel == null) {
personListAsModel = new ListDataModel(personList);
}
return personListAsModel;
}
}
答案 1 :(得分:0)
我通过以下方式解决了问题(至少现在):
<p:dataTable value="#{personBean.personList}" var="person">
<p:column headerText="No">
<h:outputText value="#{personBean.personList.indexOf(person) + 1}"/>
</p:column>
...
正如我所见,这是一个干净的选择,但仍然是ListDataModel
无效的原因。希望这有助于某人。
赞赏ListDataModel
的任何其他贡献
答案 2 :(得分:-1)
没有得到这一行:
<h:outputText value="#{personBean.personListAsModel.rowIndex + 1}"/>
您正在尝试访问数据模型的rowIndex但是您没有在此行中进行迭代,因此它始终为您提供索引....您正在从数据表进行迭代,并且您已为此定义了var用那个
<h:outputText value="#{person.rowIndex + 1}"/>
如果没有,应该解决它。