【问题标题】:@ViewScoped, f:setPropertyActionListener only works once@ViewScoped, f:setPropertyActionListener 只工作一次
【发布时间】:2013-10-03 00:34:17
【问题描述】:

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

@ManagedBean
@RequestScoped
public class TheRequestScopedManagedBean {

   private String number
   ...

@ManagedBean
@ViewScoped
public class TheViewScopedManagedBean {

    private String number;
    ...

这是视图,它使用了丰富的数据表: (action 方法仅用于显示 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)。

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

【问题讨论】:

    标签: jsf


    【解决方案1】:

    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"/>
    

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

    【讨论】:

    • 感谢回复,我试试看。
    • 由于您删除了action属性,我还有一个问题:如果rich:tabPanel有“activeItem”属性,我该如何切换下一个标签?
    • @Christian 该选项卡有一个 switchToItem(tabname) javascript 函数,您可以使用它来切换到命名选项卡
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2017-01-06
    • 2018-06-22
    • 2015-09-18
    • 2013-12-31
    • 1970-01-01
    • 2013-09-28
    • 2013-03-30
    相关资源
    最近更新 更多