0
<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の場合はオプションを表示し、タイプBIの場合は需要を表示します。初めてページをレンダリングするとき、これは正常に機能します。ただし、何らかのアクションのためにページに投稿し直すと、エラーが発生します。

[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のインスタンスであるにもかかわらず、そのオブジェクトが条件を通過したように見えます。これは、外部(outerItems)を評価する前に内部dataTable(InnerItems)を評価しているようなものです。私の実際の仮定は、レンダリングされた属性が実際にどのように/いつ評価されるかを理解していないということです。

4

2 に答える 2

2
 <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>

どういうわけか、レンダリングされた条件をデータテーブルに直接追加することは、推測/エッグハントを何時間も繰り返したときに私には起こりませんでした(私は本当に必死でした)。そもそもなぜこれが機能しなかったのかはまだわかりませんが、機能しています。

于 2010-03-26T22:08:32.960 に答える
0

これが古い投稿であることは知っていますが...最初のスニペットでなぜ機能しなかったのか疑問に思っている場合は、閉じ中括弧がないことが原因である可能性があります。

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

これは、レンダリングされた条件をデータテーブルに配置したときに正しく設定されました。

rendered="#{item.typeA}"> <!--  THIS IS THE CHANGE -->
于 2012-02-01T16:44:04.630 に答える