2015-08-28 8 views
1

Mojarra 2.1.Компоненты все еще попадают в дерево компонентов, даже если атрибут render is false

Я проверил способ public void execute(FacesContext facesContext) throws FacesException в классе com.sun.faces.lifecycle.RestoreViewPhase. Теперь, после восстановления представления с помощью invokation viewRoot = viewHandler.restoreView(facesContext, viewId);, мы имеем дерево compelete из предыдущего запроса (если это postback).

Я проверил, что дерево (итерации вручную через children свойств компонентов в отладчике) и обнаружил, что составные компоненты, объявленные следующим образом:

<h:panelGroup rendered="#{bean.id == 1}"> 
    <utils:dropDownListFilterItem /> 
</h:panelGroup> 
<h:panelGroup rendered="#{bean.id == 2}"> 
    <utils:dateFilterItem /> 
</h:panelGroup> 
<h:panelGroup rendered="#{bean.id == 3}"> 
    <utils:fieldFilterItem /> 
</h:panelGroup> 

были все в этом дереве. Это происходило, несмотря на то, что #{bean.id} был оценен до 2. Я подсчитал, что единственный экземпляр <utils:dateFilterItem /> будет в дереве.

Итак, мой вопрос заключается в том, как обработчик rendered обрабатывается Mojarra? Включен ли атрибут только для фазы render-responces?

ответ

7

Атрибут rendered не используется во время операции RestoreView -Phase. Первый раз, когда он оценивается, находится в ApplyRequestValue -Фазе. Это связано с тем, что во время RestoreView -Фаза не применяются значения запроса. Таким образом, атрибут rendered, который может зависеть от этих значений, не может быть оценен.

были все в этом дереве. Это произошло несмотря на то, что # {bean.id} было оценено до 2. Я подсчитал, что единственный экземпляр будет в дереве.

компонент дерева из JSF осознает всех компонентов, независимо от того, если они оказаны или нет. Это позволяет использовать rerender определенный компонент со всеми его внутренними компонентами (часто используемыми с флажками и т. Д.). Если внутренние - еще не визуализированные компоненты - будут отсутствовать внутри дерева компонентов, использование render="outerComponent" не сможет показать внутренние компоненты, если их атрибут rendered теперь оценивается как true.

Чтобы избежать компонента неоспоримый добавил к этому дереву на всех, вы должны использовать JSTL -tag, такие как <c:if > - если это имеет значение ложь, то компонент не будет добавлен в дерево компонентов на всех, так JSF начнет обрабатывать дерево, не зная об определенном компоненте.

Вы также можете прочитать этот пост, где разница объясняется с примерами и гораздо более подробно: JSTL in JSF2 Facelets... makes sense?

+4

Другой связанный с этим вопрос: http://stackoverflow.com/q/18768527 – BalusC