1

我在我的项目中使用了 3 个 selectOneMenu 组件。我需要在第一个更改后重新加载第二个的内容。以下是部分文件

索引.xhtml

<h:form id="form">
<p:selectOneMenu id="Rząd" value="#{birdSelectorBean.selectedState}" effect="fade"
style="width: 150px;">  
<f:selectItem itemLabel="Rząd" itemValue="" />  
<f:selectItems value="#{birdSelectorBean.rzad}" />  
<p:ajax render="@form" listener="#{birdSelectorBean.stateChangeListener}" />
</p:selectOneMenu> 

<p:selectOneMenu id="rodzina" value="#{birdSelectorBean.selectedState}" effect="fade"
style="width: 150px;">  
<f:selectItem itemLabel="Rodzina" itemValue="" />
<f:selectItems value="#{birdSelectorBean.rodzina}" />
</p:selectOneMenu>

<p:selectOneMenu id="rodzaj" value="#{birdSelectorBean.selectedState}" effect="fade"
style="width: 150px;">  
<f:selectItem itemLabel="Rodzaj" itemValue="" />   
<f:selectItems value="#{birdSelectorBean.rodzaj}" />
</p:selectOneMenu>
</h:form>

BirdSelectionBean.java:

public class BirdSelectorBean
{
private String selectedState;
private List<SelectItem> rzad;
private List<SelectItem> rodzina;
private List<SelectItem> rodzaj;

public BirdSelectorBean()
{
    rzad = new ArrayList<>();
    rzad.add(new SelectItem("Rząd_X"));
    rzad.add(new SelectItem("Rząd_Y"));
    rzad.add(new SelectItem("Rząd_Z"));

    rodzina = new ArrayList<>();
    rodzaj = new ArrayList<>();
}

public void stateChangeListener(ValueChangeEvent event)
{
    rodzina.clear();
    rodzina.add(new SelectItem("Rodzina_A"));
    rodzina.add(new SelectItem("Rodzina_B"));
    rodzina.add(new SelectItem("Rodzina_C"));
}
...
getters and setters
...
}

我阅读了很多关于此的主题,但它对我不起作用。我尝试了 update="rodzina" 就像 这里的示例 一样,并像该 主题中所说的那样渲染选项:但它仍然不起作用。请帮我 :]

4

2 回答 2

2

p:ajax标签中更改render="@form"update="@form". 渲染被使用f:ajax,primefaces 出于某种原因使用另一个名称 - 请参见此处

于 2013-06-01T19:00:50.700 回答
1

看起来您的stateChangeListener方法永远不会被调用,更重要的是,您的托管 bean 看起来没有任何范围(至少从您的问题内容来看),请记住它必须至少@ViewScoped是为了使其工作。此外,您的代码中的另一个问题是您使用相同的属性来选择三个数据<p:selectOnuMenu>(这还不是问题,因为您还没有达到您想要的开始)。

要使 ajax 更新工作,请从stateChangeListener. 另外,让我们为下拉列表中的选定项目添加其他两个属性。

@ManagedBean
@ViewScoped
public class BirdSelectorBean {

    private String selectedState;
    private String selectedStateRodzina;
    private String selectedStateRodzaj;
    //other fields and methods...

    public void stateChangeListener() {
        rodzina.clear();
        rodzina.add(new SelectItem("Rodzina_A"));
        rodzina.add(new SelectItem("Rodzina_B"));
        rodzina.add(new SelectItem("Rodzina_C"));
    }
}

<p:selectOneMenu>然后在您的通话中更新您想要的<p:ajax>(我从样式等组件中删除了与问题属性非直接相关的属性):

<p:selectOneMenu id="Rząd" value="#{birdSelectorBean.selectedState}">
    <f:selectItem itemLabel="Rząd" itemValue="" />
    <f:selectItems value="#{birdSelectorBean.rzad}" />
    <p:ajax update="rodzina" listener="#{birdSelectorBean.stateChangeListener}" />
</p:selectOneMenu>

<p:selectOneMenu id="rodzina" value="#{birdSelectorBean.selectedStateRodzina}">
    <f:selectItem itemLabel="Rodzina" itemValue="" />
    <f:selectItems value="#{birdSelectorBean.rodzina}" />
</p:selectOneMenu>
于 2013-06-01T19:01:25.830 回答