[英]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 請求中,視圖默認僅在渲染響應階段構建。 當請求是回發時,它工作正常,因為根據定義,視圖已經在恢復視圖階段構建。
我可以想到兩種解決方法:
將<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,否則可能會發生沖突。
如果不需要轉換和驗證,那么直接傳遞#{param.tab}
即可。
<f:metadata> <f:event type="preRenderView" listener="#{tabView.setActiveIndex(param.tab)}"/> </f:metadata>
順便說一句,不錯的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.