【问题标题】:Enable/Disable <p:commandButton> through two <p:selectOneMenu>通过两个 <p:selectOneMenu> 启用/禁用 <p:commandButton>
【发布时间】:2013-10-18 19:54:57
【问题描述】:

当两个必需的 selectOneMenu 组件没有空值时,我需要启用一个 commandButton

这是我的看法:

<p:selectOneMenu converter="omnifaces.SelectItemsConverter" id="countries" required="true" value="#{countryBean.selectedCountry}">
    <f:selectItem itemLabel="#{msg['choose.option']}" />
    <f:selectItems value="#{countryBean.countries}" var="country" itemLabel="#{country.name}" />
    <f:ajax listener="#{countryBean.changeCountry}" render="cities" update="findPeopleButton" />
</p:selectOneMenu>
<p:selectOneMenu converter="omnifaces.SelectItemsConverter" id="cities" required="true" value="#{countryBean.city}">
    <f:selectItem itemLabel="#{msg['choose.option']}" />
    <f:selectItems value="#{countryBean.cities}" var="city" itemLabel="#{city.name}" />
    <f:ajax listener="#{countryBean.verifyRequiredFields}" update="findPeopleButton" />
</p:selectOneMenu>
<p:commandButton icon="ui-icon-search"
    disabled="#{countryBean.disablePeopleButton}"
    id="findPeopleButton"
    onclick="peopleDialog.show()" />

我在视图加载时禁用了该按钮,然后当我为每个 selectOneMenu 选择值时,该按钮启用,但之后当我设置某个 selectOneMenu 的空值时,我收到一条必需的验证错误消息,并且该按钮保持启用状态

这是我的支持 bean:

private Country country; // +getter+setter
private City city; // +getter+setter
private List<Country> countries; // +getter
private List<City> cities; // +getter
private boolean disablePeopleButton; // +getter+setter

@EJB
private CountryService countryService;

@PostConstruct
public void init() {
    disablePeopleButton = true;
    countries = countryService.getCountries();
}

public void changeCountry() {
    cities = countryService.getCities(country);
}

public void verifyRequiredFields() {
    if (country != null && city != null) {
        disablePeopleButton = false;
    } else {
        disablePeopleButton = true;
    }
}

我能做些什么来解决它?

【问题讨论】:

  • 不要检查verifyRequiredFields() 中的对象是否为空,而应该检查它们是否具有有效值。在我看来,您还应该在两个 selectOneMenus 上使用 &lt;f:ajax event="valueChange" listener="#{countryBean.verifyRequiredFields}" update="findPeopleButton" /&gt;。
  • 好的@LucasPate,但我真正的问题是,当我选择默认选项(选择项目)时,我的 selectOneMenu 会抛出所需的验证错误消息
  • 为什么不直接删除所有required 属性。如果没有同时选择这两个按钮,则无论如何都会禁用该按钮。

标签: java jsf primefaces selectonemenu commandbutton


【解决方案1】:

在p:selectOneMenu 中都使用itemValue=""

<p:selectOneMenu converter="omnifaces.SelectItemsConverter" id="countries" required="true" value="#{countryBean.selectedCountry}">
    <f:selectItem itemLabel="#{msg['choose.option']}" itemValue=""/>
    <f:selectItems value="#{countryBean.countries}" var="country" itemLabel="#{country.name}" />
    <f:ajax listener="#{countryBean.changeCountry}" render="cities" update="findPeopleButton" />
</p:selectOneMenu>
<p:selectOneMenu converter="omnifaces.SelectItemsConverter" id="cities" required="true" value="#{countryBean.city}">
    <f:selectItem itemLabel="#{msg['choose.option']}" itemValue=""/>
    <f:selectItems value="#{countryBean.cities}" var="city" itemLabel="#{city.name}" />
    <f:ajax listener="#{countryBean.verifyRequiredFields}" update="findPeopleButton" />
</p:selectOneMenu>
<p:commandButton icon="ui-icon-search"
    disabled="#{countryBean.disablePeopleButton}"
    id="findPeopleButton"
    onclick="peopleDialog.show()" />

【讨论】:

    【解决方案2】:

    试试这个:

    <h:form>
        <p:selectOneMenu id="countries"
            converter="omnifaces.SelectItemsConverter"
            value="#{countryBean.selectedCountry}">
            <f:selectItem itemLabel="#{msg['choose.option']}"/>
            <f:selectItems value="#{countryBean.countries}" var="country"
                itemLabel="#{country.name}" />
            <p:ajax listener="#{countryBean.changeCountry()}" 
                    update="cities findPeopleButton" />
        </p:selectOneMenu>
        <p:selectOneMenu id="cities"
            converter="omnifaces.SelectItemsConverter"
            value="#{countryBean.city}">
            <f:selectItem itemLabel="#{msg['choose.option']}" />
            <f:selectItems value="#{countryBean.cities}" var="city"
                itemLabel="#{city.name}" />
            <p:ajax update="findPeopleButton" />
        </p:selectOneMenu>
        <p:commandButton icon="ui-icon-search"
            disabled="#{empty countryBean.city}"
            id="findPeopleButton" onclick="peopleDialog.show()" />
    </h:form>
    

    还有这个:

        private Country selectedCountry; // +getter+setter
        private City city; // +getter+setter
        private List<Country> countries; // +getter
        private List<City> cities; // +getter
    
        @EJB
        private CountryService countryService;
    
        @PostConstruct
        public void init() {
            countries = countryService.getCountries();
        }
    
        public void changeCountry() {
            if (selectedCountry != null) {
                cities = countryService.getCities(selectedCountry);
            }
            city = null;
        }
    

    不知道这与您的问题有何关联,但您在 Facelets 代码中使用了 #{countryBean.selectedCountry},而 bean 中只有 country。您还在&lt;f:ajax&gt; 上使用了render 和update,它只有前者,而&lt;p:ajax&gt; 只有后者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      相关资源
      最近更新 更多