禁用 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)
}
我有一个从地图对象生成的下拉列表,它会根据我从数据库中获得的列表数量进行重复,例如,从数据库中获取 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)
}