【问题标题】:ListDataTable rowIndex not workingListDataTable rowIndex 不起作用
【发布时间】:2016-08-29 06:21:24
【问题描述】:

我正在尝试使用行数构建<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       |

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

【问题讨论】:

标签: jsf jsf-2 primefaces


【解决方案1】:

我解决了这个问题(至少现在是这样):

<p:dataTable value="#{personBean.personList}" var="person">
  <p:column headerText="No">
    <h:outputText value="#{personBean.personList.indexOf(person) + 1}"/>
  </p:column>
...

正如我所见,这是一个干净的选项,但为什么 ListDataModel 不起作用仍然是个谜。

【讨论】:

    【解决方案2】:

    没有得到这条线:

     <h:outputText value="#{personBean.personListAsModel.rowIndex + 1}"/>
    

    那是您正在尝试访问数据模型的 rowIndex,但您没有在这一行中进行迭代,因此它始终为您提供索引 1....您正在从数据表中进行迭代,并且您已经为此定义了 var,所以使用它

    <h:outputText value="#{person.rowIndex + 1}"/>
    

    如果没有,应该解决。

    【讨论】:

      【解决方案3】:

      行索引存储在DataModel,默认为-1。您正在 getter 方法中创建一个新的 ListDataModel 实例。 UIData components 在每次迭代时调用 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;
          }
      
      }
      

      另见:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-28
        • 2021-02-12
        • 1970-01-01
        • 2017-06-03
        • 2019-05-04
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多