我怎样才能使p:selectOneMenu更新bean?

时间:2016-11-09 08:31:50

标签: jsf primefaces

<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对属性值执行三次,对空字符串执行两次。

1 个答案:

答案 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"/>