Jsf 识别viewAction中p:SelectOne菜单的值更改

Jsf 识别viewAction中p:SelectOne菜单的值更改,jsf,primefaces,jsf-2.2,Jsf,Primefaces,Jsf 2.2,我在母版页模板上有一个货币列表。我还可以在不同产品的一系列价格之间进行搜索 设置范围后按a键时,页面将重定向到另一个页面,该页面根据范围显示产品列表 在此之后,如果试图如上所述更改货币,我想重定向到主页 下面的XHTML和相应的托管bean将根据中选定的范围显示产品列表 在主模板上更改货币时,将调用currencyChanged方法,将valueChanged的值设置为true,但在viewAction方法中不可用 在调用currencyChanged方法之前,viewAction方法似乎很早就

我在母版页模板上有一个货币列表。我还可以在不同产品的一系列价格之间进行搜索

设置范围后按a键时,页面将重定向到另一个页面,该页面根据范围显示产品列表

在此之后,如果试图如上所述更改货币,我想重定向到主页

下面的XHTML和相应的托管bean将根据中选定的范围显示产品列表

在主模板上更改货币时,将调用currencyChanged方法,将valueChanged的值设置为true,但在viewAction方法中不可用

在调用currencyChanged方法之前,viewAction方法似乎很早就被调用了

如何避免这种情况

无论如何,我需要重定向到主页,如果在根据范围滑块显示产品列表后在母版页模板上更改了货币

我不会在这里多余地显示XHTML代码


它就像内部一样。

什么时候调用viewAction?更改视图时,视图范围bean中的值将被重置。为什么不简单地将重定向方法添加到货币更改事件侦听器中?也许ValueC改应该在一个会话范围bean中。对不起,我忘了考虑另一个在这个问题中没有涉及的事情。页面已经从另一个bean重定向,当在其中更改货币时,它将从绑定/映射到的onchange事件的action方法重定向。因此,这个bean ProductPriceManagedBean重新构建。我现在从另一个bean重定向到另一个bean,它基于一个适当的、无害的条件检查。如果该页面没有从该bean重定向,那么该方法将按原样工作。
<ui:define name="metaData">
    <f:metadata>
        <f:viewParam name="minPrice" value="#{productPriceManagedBean.minPrice}" maxlength="20"/>
        <f:viewParam name="maxPrice" value="#{productPriceManagedBean.maxPrice}" maxlength="20"/>
        <f:viewAction action="#{productPriceManagedBean.viewAction}"/>
    </f:metadata>
</ui:define>
@ManagedBean
@ViewScoped
public final class ProductPriceManagedBean implements Serializable
{
    private BigDecimal minPrice; //Getter and setter.
    private BigDecimal maxPrice; //Getter and setter.
    private boolean valueChanged;
    private static final long serialVersionUID = 1L;

    public ProductPriceManagedBean() {}     

    //This method is called, when a currency held by <p:selectOneMenu> is changed.
    public void currencyChanged(AjaxBehaviorEvent event) throws IOException {
        this.valueChanged=true;
    }

    public void viewAction()
    {            
        if(valueChanged) //valueChange is always false here.
        {
            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();  
            context.redirect(context.getRequestContextPath()+"/public_resources/Product.jsf");
        }
    }
}