我使用Primefaces 5.0有多个下拉列表。当您在第一个下拉列表中选择一个选项(在本例中为国家/地区)时,它应该抓住该国家/地区的城市并填充城市下拉列表。但是,我有代码使用国家/地区从我的数据库填充我的城市下拉列表,但从不调用该方法。
My Region.xhtml:
<h:form>
<p:tab title="Region Selection" rendered="true">
<p:panel header="Region Information">
<h:panelGrid columns="2" columnClasses="label, value">
<h:outputText value="Country" />
<p:selectOneMenu id="country" value="#{rosterBean.selectedCountry}">
<p:ajax listener="#{rosterBean.onCountryChange()}" update="state" />
<f:selectItem itemLabel="Select Country" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{rosterBean.countries}" />
</p:selectOneMenu>
<h:outputText value="State/ Province" />
<p:selectOneMenu id="state" value="#{rosterBean.selectedState}">
<p:ajax listener="#{rosterBean.onStateChange}" />
<f:selectItem itemLabel="Select State" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{rosterBean.states}" />
</p:selectOneMenu>
<h:outputText value="City" />
<p:selectOneMenu id="city" filter="true" filterMatchMode="contains" >
<f:selectItem itemLabel="Johannesburg" itemValue="0" noSelectionOption="true" />
<f:selectItem itemLabel="Pretoria" itemValue="1" noSelectionOption="true" />
</p:selectOneMenu>
</h:panelGrid>
</p:panel>
</p:tab>
</h:form>
我的豆子:
@ViewScoped
@ManagedBean
public class RosterBean implements Serializable {
public void onCountryChange() {
System.out.println("Updating State");
}
}
我得到了所有的getter和setter,但是从未调用过system.out。所以不管它是否会在那个国家打电话给正确的城市,它永远不会到达那里。
答案 0 :(得分:0)
您的输入元素和p:ajax
需要嵌套在h:form
中,否则POST上不会提交任何数据。 actionListeners
有时需要访问提交的值(通过方法参数或ActionEvent),因此如果提交的值不可用,则不会调用侦听器。
提示:您可以查看浏览器的开发人员工具,了解实际提交的内容。
你似乎仍然遇到了一些麻烦,所以这里有一个完整的例子,稍微修改一下你自己:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
</h:head>
<h:body>
<h:form>
<p:panel header="Region Information">
<h:panelGrid columns="2" columnClasses="label, value">
<h:outputText value="Country" />
<p:selectOneMenu id="country" value="#{rosterBean.selectedCountry}" >
<p:ajax listener="#{rosterBean.onCountryChange()}" update="state" />
<f:selectItem itemLabel="Select Country" itemValue="" noSelectionOption="true" />
<f:selectItem itemLabel="Country 1" itemValue="1" />
</p:selectOneMenu>
<h:outputText value="State/ Province" />
<p:selectOneMenu id="state" value="#{rosterBean.selectedState}" >
<p:ajax listener="#{rosterBean.onCountryChange}" />
<f:selectItem itemLabel="Select State" itemValue="" noSelectionOption="true" />
<f:selectItem itemLabel="State1 1" itemValue="1" />
</p:selectOneMenu>
</h:panelGrid>
</p:panel>
</h:form>
<p:commandButton value="Next"/>
</h:body>
</html>
(请注意,我从class
删除了commandButton
属性。class
不是commandButton
上的有效属性。)
RosterBean.java
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class RosterBean {
public String selectedCountry;
public String selectedState;
public String getSelectedCountry() {
return selectedCountry;
}
public void setSelectedCountry(String selectedCountry) {
this.selectedCountry = selectedCountry;
}
public String getSelectedState() {
return selectedState;
}
public void setSelectedState(String selectedState) {
this.selectedState = selectedState;
}
public void onCountryChange() {
System.out.println("Updating State");
}
}