0

我有 2 个 managedBean:第一个 (RequestScoped) 通过 ah:commandLink 向第二个 (ViewScoped) 发送参数。两个 managedBeans 都在同一个页面中,但我在 Rich:TabPanel 的不同选项卡中使用它们:

@ManagedBean
@RequestScoped
public class TheRequestScopedManagedBean {

   private String number
   ...

@ManagedBean
@ViewScoped
public class TheViewScopedManagedBean {

    private String number;
    ...

这是视图,它使用了rich:dataTable:(操作方法仅用于显示rich:tabPanel 中的第二个选项卡)。

// ... another dataTable's columns 
<rich:column>
    <f:facet name="header">Number</f:facet>
    <b>
        <a4j:commandLink value="#{theRequestScopedManagedBean.number}"  
         render="someRichPanel" action="#{anotherBean.showSecondTab}" immediate="true">
             <f:setPropertyActionListener target="#{theViewScopedManagedBean.number}" value="#{theRequestScopedManagedBean.number}" />
        </a4j:commandLink>
   </b>
</rich:column>

这里的问题是 ViewScopedBean 仅在第一次显示该值,而当我再次尝试传递它时,它会显示其默认值(null)。

我在这个网站上看到了几个问题。但我真的不知道在这种情况下该怎么办。

4

1 回答 1

0

action="#{anotherBean.showSecondTab}"将导致导航案例触发。这反过来会导致视图和请求范围的 bean 被销毁和重新创建(就像视图范围 bean 的预期行为一样)。

如果您使用的是 EL2.2,您可以轻松地将值直接传递到视图范围 bean 中的方法中。假设您的 viewscoped bean 有一个方法takeValue,您可以将参数直接传递给方法,如下所示:

    <a4j:commandLink value="#{theRequestScopedManagedBean.number}" render="someRichPanel" action="#{theViewScopedBean.takeValue(theRequestScopedManagedBean.number)}" immediate="true"/>

仍然有更简洁的方法在页面之间传输数据。

于 2013-10-03T01:17:54.033 回答