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

Disable some value on JSF Dropdown list

我有一个从地图对象生成的下拉列表,它会根据我从数据库中获得的列表数量进行重复,例如,从数据库中获取 5 个项目,它会为每一行生成 5 个下拉列表.

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

例如,如果我在下拉列表中有以下项目(1、2、3、4、5),如果第一行我 select 项目 1,则以下下拉列表只会有剩余的项目 available/selectable (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);
}

这是我对 select 一个菜单所做的更改:

         <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 中被检测为 null(值未传递),即使它已经 selected。

您可以使用 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)
}