<h:form>
<h:panelGrid columns="2" style="margin-bottom:10px" cellpadding="5">
<p:outputLabel for="providerSelect" value="Provider:" />
<p:selectOneMenu id="providerSelect" value="#{programsController.provider}" style="width:125px">
<p:ajax event="change" listener="#{programsController.providerSelected}" update="programsTable" />
<f:selectItem itemLabel="Select Provider" itemValue="" />
<f:selectItems value="#{providersController.providers}" var="provider" itemLabel="#{provider.name} (#{provider.uri})" />
<f:converter binding="#{providerConverter}"/>
</p:selectOneMenu>
</h:panelGrid>
</h:form>
不调用programsController.setProvider。
转换器getAsObject
对属性值执行三次,对空字符串执行两次。
答案 0 :(得分:1)
Update2:您的转换器现在也获取单个selectItem的空字符串。
您可以将此部件添加到转换器getAsObject方法:
if(value.length() == 0) return null;
您还需要对象类中的方法来验证它是否正确。这是一个示例,用提供者对象的唯一标识符替换getId()。
//for converter check if the object is valid
public boolean equals(Object o){
if (o == this) return true;
if(o instanceof Provider) {
if(
this.getId() == ((Provider)o).getId()){
return true;
}else{
return false;
}
}else{
return false;
}
}
更新:此部分不再正确,因为问题已更新
您的ajax事件不处理该值,您只更新组件。
只需将process =“@ this”添加到ajax事件中,然后它就会将值处理到bean:
<p:ajax event="change" update="@this programsTable" process="@this"/>