ListDataTable rowIndex不起作用

时间:2016-05-04 01:49:45

标签: jsf jsf-2 primefaces

我尝试使用行计数构建<p:dataTable>,但由于某种原因,它只显示每行中的第一个索引。这是我的代码:

的index.xhtml

<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

PersonBean.java

@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       |

我有什么遗失的吗?任何指导/帮助表示赞赏。提前致谢

3 个答案:

答案 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}"/>
如果没有,应该解决它。