我想创建<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'已解析为null
为什么会这样?
P.S。:除了@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>
在这种情况下,您必须激发ajax-request以通过<p:ajax event="tabChange" />
或dynamic="true" cache="false"
答案 0 :(得分:1)
那是因为该视图尚未构建,因此尚未评估所有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>
这样做有效,因为<f:viewParam>
没有value
默认情况下会将转换和验证的请求参数值作为请求属性放在同一个名称#{tab}
下。您只需要确保您没有使用相同名称的请求范围的托管bean,否则它可能会发生冲突。
如果您不需要转换和验证,请直接传递#{param.tab}
。
<f:metadata>
<f:event type="preRenderView" listener="#{tabView.setActiveIndex(param.tab)}"/>
</f:metadata>