ForEach и Facelets - PullRequest
       9

ForEach и Facelets

0 голосов
/ 03 июня 2009

Мой управляемый компонент:

public List<String> getLiQuickNav(){

    System.out.println("I'm here...");

    List<String> l = new ArrayList<String>();
    l.add("toto");
    l.add("tata");
    l.add("titi");
    return l;
}

Мой forEach:

<c:forEach var="categorie" items="#{mainControleur.liQuickNav}">
    <h:outputLabel value="${categorie}"/>
</c:forEach>

Мой выходной поток:
Я здесь ...
Я здесь ...
Я здесь ...
Я здесь ...

Как вы можете видеть, getLiQuickNav () вызывается 4 раза моим ForEach. Но я просто не хочу вызывать getLiQuickNav () один раз ... Как это назвать только один раз?

Бонусный вопрос: Почему «getLiQuickNav ()» вызывается 4 раза, тогда как у меня есть только 3 элемента «tata, titi, toto»?

Спасибо в

Ответы [ 3 ]

3 голосов
/ 03 июня 2009

Вы не можете контролировать количество вызовов getLiQuickNav() - рассмотрите возможность кэширования вашего списка, чтобы он не перестраивался между вызовами.

private List<String> l;

public List<String> getLiQuickNav()
{
     if ( l == null )
     {
          System.out.println("I'm here...");

          l = new ArrayList<String>();
          l.add("toto");
          l.add("tata");
          l.add("titi");
     }
     return l;
}

Также вы должны использовать <ui:repeat/> вместо <c:forEach/>. Посмотрите эту запись blog почему.

2 голосов
/ 03 июня 2009

Getter's в Java (в любом контексте, для включения в Faces Managed Beans) не должны генерировать ничего - они должны просто возвращать значение. Создайте список заранее и верните его.

2 голосов
/ 03 июня 2009

Ответ

Вы каждый раз переинициализируете состояние в геттере. Это должен быть метод доступа, а не способ инициализации состояния. Не создавайте список в getLiQuickNav, не создавайте его в конструкторе или установщике.

Бонус

При первом вызове getLiQuickNav() при инициализации списка ссылка на этот список возвращается и сохраняется в области видимости для оценки вашего выражения (.liQuickNav), а затем getLiQuickNav() вызывается по соглашению еще 3 раза каждый элемент в списке.

Он должен быть вызван один раз, если вы каждый раз возвращаете один и тот же список. Вы возвращаете новый каждый раз.

...