2

我想创建<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" />在这种情况下,您必须通过或触发 ajax-request 将值放入 viewMapdynamic="true" cache="false"

4

1 回答 1

1

那是因为此时尚未构建视图,因此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>
    

    这行得通,因为默认情况下<f:viewParam>没有value遗嘱将转换和验证的请求参数值作为请求属性放在同名下#{tab}。您只需要确保您没有同名的请求范围内的托管 bean,否则可能会发生冲突。

  2. 如果不需要转换和验证,那么直接通过#{param.tab}即可。

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

顺便说一句,不错的方法。

也可以看看:

于 2015-09-15T19:15:30.220 回答