JSF внутренняя таблица данных не соблюдает визуализированное состояние внешней таблицы - PullRequest
0 голосов
/ 27 марта 2010
<h:dataTable cellpadding="0" cellspacing="0"
    styleClass="list_table" id="OuterItems"
    value="#{valueList.values}" var="item" border="0">
    <h:column rendered="#{item.typeA}">
        <h:dataTable cellpadding="0" cellspacing="0"
        styleClass="list_table" id="InnerItems"
        value="#{item.options}" var="option" border="0">
            <h:column >
                <h:outputText value="Option: #{option.displayValue}"/>
            </h:column>
        </h:dataTable>
    </h:column>
    <h:column rendered="#{item.typeB}">
        <h:dataTable cellpadding="0" cellspacing="0"
        styleClass="list_table" id="InnerItems"
        value="#{item.demands}" var="demand" border="0">
            <h:column >
                <h:outputText value="Demand: #{demand.displayValue}"/>
            </h:column>
        </h:dataTable>
    </h:column>
</h:dataTable>

public class Item{
    ...
    public boolean isTypeA(){
        return this instanceof TypeA;
    }

    public boolean isTypeB(){
        return this instanceof TypeB;
    }
    ...

}

public class typeA extends Item(){
    ...
    public List getOptions(){
        ....
    }
    ...
}

public class typeB extends Item(){
    ...
    public List getDemands(){
        ...
    }
    ....
}

У меня проблема с JSF. Я изложил эту проблему здесь и надеюсь, что кто-нибудь может помочь мне понять, почему мои действия терпят неудачу. Я перебираю список предметов. Эти Предметы на самом деле являются экземплярами подклассов TypeA и TypeB. Для типа A я хочу отобразить параметры, для типа B я хочу отобразить требования. При рендеринге страницы в первый раз это работает нормально. Однако, когда я возвращаюсь на страницу для какого-либо действия, я получаю сообщение об ошибке:

[3/26/10 12:52:32:781 EST] 0000008c SystemErr     R   javax.faces.FacesException: Error getting property 'options' from bean of type TypeB
    at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:89)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java(Compiled Code))
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:91)
    at com.ibm.faces.portlet.FacesPortlet.processAction(FacesPortlet.java:193)

Мое понимание жизненного цикла JSF очень грубое. На данный момент я понимаю, что в фазах ApplyRequestValues ​​произошла ошибка, которая очень ранняя, поэтому предыдущее состояние восстанавливается и ничего не меняется.

Чего я не понимаю, так это того, что для выполнения условия рендеринга "item.typeA" этот объект должен быть экземпляром TypeA. Но здесь, похоже, что объект прошел условие, хотя это был экземпляр TypeB. Это похоже на оценку внутренней dataTable (InnerItems) перед оценкой внешней (externalItems). Мое рабочее предположение состоит в том, что я просто не понимаю, как / когда фактически отображается визуализированный атрибут.

Ответы [ 2 ]

2 голосов
/ 27 марта 2010
 <h:column rendered="#{item.typeA}">
        <h:dataTable cellpadding="0" cellspacing="0"
        styleClass="list_table" id="InnerItems"
        value="#{item.options}" var="option" border="0"
        rendered="#{item.typeA}"> <!--  THIS IS THE CHANGE -->
            <h:column >
                <h:outputText value="Option: #{option.displayValue}"/>
            </h:column>
        </h:dataTable>
    </h:column>

Каким-то образом добавление визуализированного условия непосредственно в таблицу данных мне не пришло в голову в моей многочасовой итерации догадок / охоты на яйца (я был действительно в отчаянии). Я до сих пор не понимаю, почему это не сработало, но работает.

0 голосов
/ 01 февраля 2012

Я знаю, что это старый пост, но ... если вам все еще интересно, почему он не работал в вашем первом фрагменте, возможно, это потому, что вам не хватает закрывающей фигурной скобки:

<h:column rendered="#{item.typeA">
<h:column rendered="#{item.typeB">

Это было правильно установлено, когда вы помещаете условие рендеринга в datatable.

rendered="#{item.typeA}"> <!--  THIS IS THE CHANGE -->
...