[英]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.