在JSF下拉列表中禁用某些值

时间:2015-03-13 02:22:14

标签: ajax jsf primefaces

我有一个从地图对象生成的下拉列表,根据我从DB获得的列表数量会重复,例如,来自数据库的5个项目,它将生成5个下拉列表每一行。

我可以通过将下拉列表的值分配给列表中的变量来获取下拉列表的值,但我想要的是从列表中禁用某些选定的值。

例如,如果我在下拉列表中有以下项目(1,2,3,4,5),并且如果第一行我选择了项目1,那么以下下拉列表将只剩下其余项目/可选择的(2,3,4,5)。

我知道我可以使用<p:ajax>,但有任何想法如何禁用该项?

<p:dataTable var="tableDefinition" id="tableDefinition" value="#{fileUploadManagedBean.theTableList}" rowIndexVar="tdi">
    <p:column headerText="no" width="2%">
        <h:outputText value="#{tdi + 1}" />
    </p:column>
    <p:column headerText="Header" width="25%">
        <h:outputText value="#{tableDefinition.header}" />
    </p:column>
    <p:column headerText="Sample Value" width="25%">
        <h:outputText value="#{tableDefinition.sampleValue}" />
    </p:column>
    <p:column headerText="Map Field" width="25%">
        <p:selectOneMenu id="fieldList" 
                         value="#{tableDefinition.fieldName}" style="width:150px" >
            <f:selectItem itemLabel="#{msg['form.import.upload_type_select']}" itemValue="" noSelectionOption="true" />
            <f:selectItems value="#{fileUploadManagedBean.fieldTypes}" />
        </p:selectOneMenu>
    </p:column>
</p:dataTable>

顺便与其他人分享,这就是我放在我的支持bean上的原因:

 public void doCheckList(String fieldType){
 Set<String> keySet = selectedFieldTypes.keySet();

    Iterator<String> iterator = keySet.iterator();

    List<String> removeList = new ArrayList();

    while(iterator.hasNext()){
        String selectedField = iterator.next();
        boolean isEqual = false;
        for(int i=0;i<theTableList.size();i++){
            TableDefinition tdef = theTableList.get(i);
            String fieldName = tdef.getFieldName();

            if(selectedField.equals(fieldName)){
                isEqual = true;
            }

            if(i == (selectedFieldTypes.size() - 1) && !isEqual){
                removeList.add(selectedField);
            }

    }
    }

    if(removeList.size()>0){
        for(String fieldToRemove:removeList){
            if(fieldToRemove!=null){
                selectedFieldTypes.remove(fieldToRemove);
            }
        }
    }
    selectedFieldTypes.put(fieldType,fieldType);
 }
public boolean isItemSelected(String fieldType) {       
    return selectedFieldTypes.containsKey(fieldType);
}

以下是我选择的菜单中的更改内容:

         <p:selectOneMenu  id="fieldList" value="#{tableDefinition.fieldName}" style="width:150px" >
            <f:selectItem itemLabel="#{msg['form.import.upload_type_select']}" itemValue=" " itemDisabled="#{fileUploadManagedBean.isItemSelected(item)}" />

            <f:selectItems value="#{fileUploadManagedBean.fieldTypes}" var="item" itemDisabled="#{fileUploadManagedBean.isItemSelected(item)}" />
            <p:ajax onstart="showAjaxLoading();" oncomplete="hideAjaxLoading();" listener="#{fileUploadManagedBean.doCheckList(tableDefinition.fieldName)}" update=":importData" />
        </p:selectOneMenu>

我现在遇到的问题是,即使已经选择了已禁用的项,也会在辅助bean中检测到该值(该值未被传递)。

1 个答案:

答案 0 :(得分:3)

您可以使用itemDisabled属性:

<f:selectItem itemLabel="#{msg['form.import.upload_type_select']}" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{fileUploadManagedBean.fieldTypes}" var="item" itemDisabled="#{fileUploadManagedBean.isItemSelected(item)}"/>

在你的支持bean中:

public boolean isItemSelected(FieldType fieldType) {
     return selectedFieldTypes.contains(fieldType)
}