JSF 2.0: Почему в компоненте создается форма JSF-бобов, когда он используется в компоненте, который не отображается?

StackOverflow https://stackoverflow.com/questions/4214457

Вопрос

Давайте имеем чрезвычайно простую композитный компонент:

<cc:implementation>
    #{testBean.someField}
</cc:implementation>

Боб для этого:

public class TestBean {

    private boolean someField = false;
    public boolean getSomeField() { return someField; }

    @PostConstruct
    public void init() {
        System.out.println("PostConstruct");
    }

}

Затем назовите это как обычно, но не показывать это:

<codeEditor:test rendered="#{false}" />

Что происходит, состоит в том, что компонент никогда не визуализируется, и боб никогда не инициирован, как и кто-то.

Однако, если мы изменим компонент как:

<cc:implementation>
    <h:outputText value="#{testBean.someField}" />
</cc:implementation>

Что происходит, это то, что компонент до сих пор никогда не получается (потому что rendered атрибут есть false), однако, фасоль делает создание. Это происходит всегда, когда мы используем свойство компонента в рамках какого-либо нативного компонента JSF (h:panelGroup, h:inputHidden, что бы ни).

Почему это так?

Это было полезно?

Решение

Компоненты (и все связанные бобы) создаются во время просмотра времени сборки. Оказанный атрибут оценивается только во время просмотра времени. Он всегда работал таким образом в JSF.

Если фасоль делает некоторую дорогую работу во время строительства, я предлагаю позволить этой дорогой работе зависеть от некоторого состояния, которое вы затем повторно используете в оказанном атрибуте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top