JSF Inner DataTable لا يحترم الحالة المقدمة للجدول الخارجي

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

سؤال

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

قبضتي على Lifecyle JSF قاسية للغاية. في هذه المرحلة ، أفهم أن هناك خطأ في مراحل التقسيم المتساقطة التي تكون مبكرة جدًا وبالتالي تتم استعادة الحالة السابقة ولا تتغير شيء.

ما لا أفهمه هو أنه من أجل fufill شرط تقديم "item.typea" يجب أن يكون هذا الكائن مثيلًا للكملة. ولكن هنا ، يبدو أن هذا الكائن اجتاز الشرط على الرغم من أنه كان مثيلًا للنوع. يبدو الأمر كما لو أنه يقوم بتقييم dataTable (inneriTems) قبل تقييم الخارجي (OuterItems). افتراض عملي هو أنني لا أفهم كيف/عندما يتم تقييم السمة المقدمة بالفعل.

هل كانت مفيدة؟

المحلول

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

بطريقة ما ، فإن إضافة الحالة المقدمة مباشرة إلى Datatable لم يحدث لي في تكراري الساعات العديدة للتخمينات / مطاردة البيض (كنت يائسة حقًا). ما زلت لا أفهم لماذا لم ينجح هذا في المقام الأول ، لكنه يعمل.

نصائح أخرى

أعلم أن هذا منشور قديم ولكن ... إذا كنت لا تزال تتساءل عن سبب عدم عمله في المقتطف الأول ، فربما يكون ذلك لأنك تفتقد الدعامة المجعد الختامية:

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

تم تعيين هذا بشكل صحيح عندما تضع الشرط المقدم على DataTable.

rendered="#{item.typeA}"> <!--  THIS IS THE CHANGE -->
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top