繁体   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