我在项目中使用了3个selectOneMenu组件。我需要在第一次更改后重新加载第二个内容。以下是文件的一些部分
的index.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
...
}
我阅读了很多相关主题,但它对我不起作用。我尝试了更新=“rodzina”,就像它在例子中一样 here 和渲染选项就像在那里说的那样 topic: 但它仍然无效。请帮帮我:]
答案 0 :(得分:2)
在p:ajax
标记中将render="@form"
更改为update="@form"
。 Render由f:ajax
使用,由于某种原因,primefaces使用其他名称 - 请参阅here。
答案 1 :(得分:1)
看起来您的stateChangeListener
方法被调用,更重要的是,您的托管bean看起来没有任何范围(至少来自您的问题内容),请记住它必须至少@ViewScoped
为了使这项工作。此外,您的代码中的另一个问题是您使用相同的属性来选择三个<p:selectOnuMenu>
的数据(这还不是问题,因为您还没有实现您想要的开始)。< / p>
要使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>