2014-09-05 53 views
1

我在我的頁面上使用了<p:accordionPanel dynamic="true">。提交頁面時,未加載對象的屬性將獲得應用的空值。我不想要這種行爲,因爲這些值在數據庫和服務器端是正確的。爲什麼在瀏覽器中不顯示它們會導致在服務器端將它們置零。我認爲這個值不應該應用,因爲它們還沒有被渲染。對象的屬性在延遲加載的AccordionPanel組件上更新爲null

我XHTML(片段):

<p:accordionPanel dynamic="true" value="#{controller.selectedObject.list}" var="listItem"> 
    <p:selectOneMenu value="#{list.market}" disabled="#{controller.selectedObject.isDisabled}"> 
    <f:selectItems value="#{marketSelectItems.selectItems}" /> 
    </p:selectOneMenu> 
</p:accordionPanel> 

假設controller.selectedObject.list包含BeanA,兩者有一個充滿財產market兩個條目。
現在有controller.selectedObject.isDisabled設置爲true我的日誌狀態時:

10:21:12,565 TRACE [de.bss.dm.kairos.gui.phaselistener.AnyPhaseListener:25] UPDATE_MODEL_VALUES 4 before Phase 
10:21:12,577 TRACE [de.bss.dm.kairos.gui.phaselistener.AnyPhaseListener:20] UPDATE_MODEL_VALUES 4 after Phase 

,一切工作正常,值保持分配。

controller.selectedObject.isDisabled設置爲false我的日誌狀態時,但是:

10:21:51,210 TRACE [de.bss.dm.kairos.gui.phaselistener.AnyPhaseListener:25] UPDATE_MODEL_VALUES 4 before Phase 
10:21:51,228 INFO [stdout] (default task-46) setMarket([email protected]) 
10:21:51,251 INFO [stdout] (default task-46) setMarket(null) 
10:21:51,265 TRACE [de.bss.dm.kairos.gui.phaselistener.AnyPhaseListener:20] UPDATE_MODEL_VALUES 4 after Phase 

導致DB堅持錯誤的價值觀,信息丟失。
當我打開第二個p:accordionPanel-Tab,導致加載數據,一切正常,第二個BeanA -Object分配了正確的Market-Object。

HTML時不工作:

<div class="ui-accordion ui-widget ui-helper-reset ui-hidden-container" role="tablist" data-widget="widget_generalForm_instrumentDetailTabs_listingpanel"> 
    <h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-state-active ui-corner-top" role="tab" aria-expanded="true"> 
    headertext loremipsum 
    </h3> 
    <div id="generalForm:instrumentDetailTabs:listingpanel:0:listingtab" class="ui-accordion-content ui-helper-reset ui-widget-content" role="tabpanel" aria-hidden="false"> 
    <div>loaded CONTENT 
    </div> 
    </div> 
    <h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-corner-top" role="tab" aria-expanded="false"> 
    headertext loremipsum 
    </h3> 
    <div id="generalForm:instrumentDetailTabs:listingpanel:1:listingtab" class="ui-accordion-content ui-helper-reset ui-widget-content ui-helper-hidden" role="tabpanel" aria-hidden="true"> 
    </div> 
    <input type="hidden" id="generalForm:instrumentDetailTabs:listingpanel_active" name="generalForm:instrumentDetailTabs:listingpanel_active" value="0"> 
</div> 

點擊第二個選項卡(或有dynamic="false"

<div class="ui-accordion ui-widget ui-helper-reset ui-hidden-container" role="tablist" data-widget="widget_generalForm_instrumentDetailTabs_listingpanel"> 
    <h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-state-active ui-corner-top" role="tab" aria-expanded="true"> 
    headertext loremipsum 
    </h3> 
    <div id="generalForm:instrumentDetailTabs:listingpanel:0:listingtab" class="ui-accordion-content ui-helper-reset ui-widget-content" role="tabpanel" aria-hidden="false"> 
    <div>loaded CONTENT 
    </div> 
    </div> 
    <h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-corner-top" role="tab" aria-expanded="false"> 
    headertext loremipsum 
    </h3> 
    <div id="generalForm:instrumentDetailTabs:listingpanel:1:listingtab" class="ui-accordion-content ui-helper-reset ui-widget-content ui-helper-hidden" role="tabpanel" aria-hidden="true"> 
    <div>loaded CONTENT OF TAB 2!!! 
    </div> 
    </div> 
    <input type="hidden" id="generalForm:instrumentDetailTabs:listingpanel_active" name="generalForm:instrumentDetailTabs:listingpanel_active" value="0"> 
</div> 

p:accordionPanel設置dynamic="false"後也導致正確的行爲,雖然我不能用它。 accordionPanels包含很多組件,當controller.selectedObject.list包含約15個項目時,導致頁面大小> 1MB。

我應該如何處理這個問題?爲什麼我的值更新,雖然他們沒有呈現/加載?

版本信息:Primefaces 5.0,WildFly 8.1.0.Final

回答

1

我通過將process="@this @(.myfakeclass)"添加到我的p:commandButton和使用 <p:outputPanel styleClass="myfakeclass">找到了解決方法。這導致HTML <div>由不存在的類定義的元素。在未加載的面板中,這個類不會被渲染,因此不會被處理。

我仍然認爲這是Primefaces中的一個bug。

0

這是primefaces已知錯誤。我在3.4.1版本中體驗它,並且由於其他錯誤而無法升級。從那時起它可能已經被修復了,因爲你沒有說你正在使用哪個版本。

我使用了兩種解決方法。對於小型組件,我設置dynamic =「false」,並在必要時將組件隱藏在html中。對於較大的組件,我在setter中放置了一個空檢查,並確保該值永遠不會合法設置爲null。

+0

我正在使用Primefaces 5。0,將此信息添加到初始帖子。 'dynamic =「false」'不是一個選項,HTML咆哮太大了。 setter中的空檢查將導致無法清空該值。可惜這是必要的.. – Ishkafel 2014-09-05 09:25:37