簡體   English   中英

在組件綁定上綁定 f:viewParam

[英]Binding f:viewParam on component binding

我想創建<f:viewParam>來設置<p:tabView>活動選項卡。 在我的頁面中,我定義了一個<f:viewParam>

<f:viewParam name="tab" value="#{tabView.activeIndex}" />

<p:tabView> binding

<p:tabView binding="#{tabView}">
    <p:tab title="tab1" />
    <p:tab title="tab2" />
    <p:tab title="tab3" />
</p:tabView>

但它不起作用。 如果我用參數?tab=1打開我的頁面,我會看到這個異常:

引起:javax.el.PropertyNotFoundException:目標無法訪問,標識符“tabView”解析為空

為什么會這樣?

PS:除了@BalusC 的回答,你還可以像這樣在 viewMap 上使用綁定組件屬性:

<f:viewParam name="tab" value="#{viewScope['activeTabIndex']}" />

<p:tabView activeIndex="#{viewScope['activeTabIndex']}">
    <p:ajax event="tabChange" />
    <p:tab title="tab1" />
    <p:tab title="tab2" />
    <p:tab title="tab3" />
</p:tabView>

在這種情況下,您必須通過<p:ajax event="tabChange" />dynamic="true" cache="false"激發 ajax-request 將值放入 viewMap

那是因為此時視圖尚未構建,因此尚未評估所有binding屬性。 這確實有點出乎意料,但在 GET 請求中,視圖默認僅在渲染響應階段構建。 當請求是回發時,它工作正常,因為根據定義,視圖已經在恢復視圖階段構建。

我可以想到兩種解決方法:

  1. <f:viewParam value><f:event type="preRenderView" listener> 在 GET 請求中,視圖在那個點被保證構建。

     <f:metadata> <f:viewParam name="tab" /> <f:event type="preRenderView" listener="#{tabView.setActiveIndex(tab)}"/> </f:metadata>

    這是有效的,因為沒有value <f:viewParam>默認將轉換和驗證的請求參數值作為請求屬性放在相同的名稱#{tab} 您只需要確保您沒有使用相同名稱的請求范圍的托管 bean,否則可能會發生沖突。

  2. 如果不需要轉換和驗證,那么直接傳遞#{param.tab}即可。

     <f:metadata> <f:event type="preRenderView" listener="#{tabView.setActiveIndex(param.tab)}"/> </f:metadata>

順便說一句,不錯的方法。

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM