2015-03-13 4 views
1

У меня есть раскрывающийся список, который создается из объекта карты, который будет повторяться в зависимости от количества списка, которое я получаю от БД, например, 5 элементов из БД, он будет генерировать 5 выпадающий список для каждой строки.Отключить некоторое значение в раскрывающемся списке JSF

Я могу получить значение выпадающего списка, назначив его переменной в списке, но я хотел бы отключить определенное выбранное значение из списка.

Например, если у меня есть в раскрывающемся списке следующие элементы (1, 2, 3, 4, 5), и если для первой строки я выбираю элемент 1, то следующие списки dropdownlists будут иметь только оставшиеся предметы/выбираемый (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> 

Btw просто поделиться с другими, вот что я надеваю бэк-боба:

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> 

проблема, с которой я сталкиваюсь сейчас, заключается в том, что отключенный элемент обнаруживается как NULL в бэк-компоненте (значение не передается), даже если оно уже выбрано.

ответ

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)}"/> 

И в вашем бэк-боба:

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

Хороший ответ, удивиться, почему это, так трудно для других, чтобы выяснить – Kukeltje

+0

@Kukeltje: Отсутствие базового знания HTML. Один из базовых знаний HTML уже знал бы, что для этого вы должны использовать атрибут '

+0

@BalusC Да, но с файлами taglib у вас есть codecompletion в вашей среде IDE ... и как насчет некоторого простого использования поисковой системы. Десятки хитов ... так что это не только отсутствие базовых знаний html, но и отсутствие исследований и других базовых знаний о развитии. – Kukeltje

Смежные вопросы