使用valueChangeListener后,验证不再有效



大家好,我有一些代码,如果用户选择国家是英国,它会显示邮政编码字段,这是有效的,但由于我添加了这个字段,我无法再让验证器工作来验证邮政编码的布局是否正确,我也无法获得所需的=true,在添加valueChangeListener 之前,这一切都很正常

这是代码:

<p:outputLabel value="#{bundle.country}" for="Countries" />
<p:selectOneMenu id="Countries" 
     value="#{bean.addressToCreate.country}"                                     
     valueChangeListener="#{country.countryLocaleCodeChanged}" 
     filter="true" 
     filterMatchMode="startsWith">
   <p:ajax update="postcodePanel" event="valueChange"/>
   <f:selectItems value="#{country.countryInMap}" />
</p:selectOneMenu>
<p:outputPanel id="postcodePanel">
  <p:outputLabel value="#{bundle.labelPostcode}" for="Postcode" />
  <p:inputText rendered="#{bean.addressToCreate.country=='United Kingdom'}" 
      id="Postcode" 
      validator="PostcodeValidator" 
      value="#{bean.addressToCreate.postcode}" 
      title="#{bundle.labelPostcode}" 
      required ="True"
      requiredMessage="#{bundle.requiredPostcode}" />
</p:outputPanel>

编辑

country.countryLocaleCodeChanged

    package sws.control;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ValueChangeEvent;
@ManagedBean(name = "country")
@SessionScoped
public class CountryBean implements Serializable {
    private static final long serialVersionUID = 1L;
    private static Map<String, String> countries;
    private String localeCode = "United Kingdom"; //default value 
    static {
        countries = new LinkedHashMap<String, String>();
        //countries.put("United Kingdom", "United Kingdom"); //label, value
        countries.put("Afghanistan", "  Afghanistan ");
        countries.put("Albania", "  Albania ");
        countries.put("Algeria", "  Algeria ");
        countries.put("Andorra", "  Andorra ");
        countries.put("Angola", "   Angola  ");
        countries.put("Antigua & Deps", "   Antigua & Deps  ");
        countries.put("Argentina", "    Argentina   ");
        countries.put("Armenia", "  Armenia ");
        countries.put("Australia", "    Australia   ");
        countries.put("Austria", "  Austria ");
        countries.put("Azerbaijan", "   Azerbaijan  ");
        countries.put("Bahamas", "  Bahamas ");
        countries.put("Bahrain", "  Bahrain ");
       countries.put("Tuvalu", "    Tuvalu  ");
        countries.put("Uganda", "   Uganda  ");
        countries.put("Ukraine", "  Ukraine ");
        countries.put("United Arab Emirates", " United Arab Emirates    ");
        countries.put("United Kingdom", "United Kingdom");
        countries.put("United States", "    United States   ");
        countries.put("Uruguay", "  Uruguay ");
        countries.put("Uzbekistan", "   Uzbekistan  ");
        countries.put("Vanuatu", "  Vanuatu ");
        countries.put("Vatican City", " Vatican City    ");
        countries.put("Venezuela", "    Venezuela   ");
        countries.put("Vietnam", "  Vietnam ");
        countries.put("Yemen", "    Yemen   ");
        countries.put("Zambia", "   Zambia  ");
        countries.put("Zimbabwe", " Zimbabwe    ");
    }
    public void countryLocaleCodeChanged(ValueChangeEvent e) {
        //assign new value to localeCode
        localeCode = e.getNewValue().toString();
    }
    public Map<String, String> getCountryInMap() {
        return this.countries;
    }
    public String getLocaleCode() {
        return localeCode;
    }
    public void setLocaleCode(String localeCode) {
        this.localeCode = localeCode;
    }
}

好吧,我不是Primefaces专家,所以这是我如何做到这一点的一个简单的JSF-2示例:

<h:form>
  <h:outputLabel value="#{bundle.country}" for="Countries" />
  <h:selectOneMenu id="Countries" value="#{bean.addressToCreate.country}">
     <f:ajax render="postcodePanel" />
     <f:selectItems value="#{country.countryInMap}" />
  </h:selectOneMenu>
  <h:panelGroup id="postcodePanel">
    <h:outputLabel value="#{bundle.labelPostcode}" for="Postcode" />
    <h:inputText rendered="#{bean.addressToCreate.country == 'United Kingdom'}" 
        id="Postcode" 
        value="#{bean.addressToCreate.postcode}" 
        title="#{bundle.labelPostcode}" 
        required="true"
        requiredMessage="#{bundle.requiredPostcode}">
      <f:validator validatorId="PostcodeValidator" />
    </h:inputText>
    <h:message for="Postcode" />
  </h:panelGroup>
</h:form>

这里的主要内容是<f:ajax>标记,当change事件发生时,它会自动触发AJAX请求。然后它告诉JSF重新提交postcodePanel

1.移除p:ajax组件。

2.在countryLocaleCodeChanged(ValueChangeEvent e)方法中添加以下代码,这些代码将完成视图更新工作。

RequestContext.getCurrentInstance.update("yourFormId:yourPanelId:postcodePanel(write the component's relative path to UIViewRoot)");

3.最后用required="true" 代替required="True"

4.也可以选择将渲染的属性添加到p:outputLabel中,以便在不需要时隐藏邮政编码标签。

最新更新