2014-01-19 4 views
1

За последние 3 дня я пытался заставить следующее работать. У меня есть datatable, который получает данные от бэк-бэка и показывает столбец с 3 переключателями. Страница отображается так, как ожидалось, и переключатели получают правильное значение. Отправка формы однако не пойдет так, как предполагалось. Всякий раз, когда я отправляю форму, значения для соответствующего объекта устанавливаются в значение последнего объекта в таблице. Как ни странно, когда я просматриваю форму, отправляемую через Fiddler, правильные значения отправляются вместо дублирования значения объекта в последней строке. Я предполагаю, что идентификатор selectOneRadio имеет какое-то отношение, но установка динамического значения для идентификатора приводит к ошибке.Отправить rich: datatable с столбцом h: selectOneRadio

Заранее благодарю вас и сообщите мне, если вам нужна дополнительная информация.

<rich:dataTable id="facilities_organisation" 
       var="orgFacility" 
       value="#{organisationFacilitiesHandler.findAllFacilitiesForCurrentOrganisation}"> 
    <rich:column> 
     <f:facet name="header"> 
      <h:outputText value="Naam" /> 
     </f:facet> 
     <h:outputText value="#{orgFacility.facility.name}" /> 
    </rich:column> 
    <rich:column> 
     <f:facet name="header"> 
      <h:outputText value="Beschikbaar?" /> 
     </f:facet> 
     <h:selectOneRadio id="facility" value="#{orgFacility.availabilityType.id}"> 
      <f:selectItems value="#{organisationFacilitiesHandler.findAllAvailabilityTypes}" /> 
     </h:selectOneRadio> 
    </rich:column> 
</rich:dataTable> 

Backbean

private Organisation activeOrganisation = null; 
private List<OrganisationFacility> facilities = new ArrayList<OrganisationFacility>(); 

public Organisation getActiveOrganisation() { 
    return this.activeOrganisation; 
} 
public void setActiveOrganisation(Organisation organisation) { 
    activeOrganisation = organisation; 
} 

public List<OrganisationFacility> getFindAllFacilitiesForCurrentOrganisation() { 
    this.facilities = new ArrayList<OrganisationFacility>(); 
    if (this.activeOrganisation != null) { 
     //Error handling omitted 
     this.facilities = facilityManager.findAllFacilitiesForOrganisation(this.activeOrganisation); 
    } 
    return this.facilities; 
} 
public void setFindAllFacilitiesForCurrentOrganisation(List<OrganisationFacility> facilities) { 
    //This function doesn't ever seem to get called... 
    LOG.debug("setFindAllFacilitiesForCurrentOrganisation was called"); 
} 

public List<SelectItem> getFindAllAvailabilityTypes() { 
    List<SelectItem> selectItems = new ArrayList<SelectItem>(); 

    //Error handling omitted 
    List<AvailabilityType> types = this.facilityManager.findAllAvailabilityTypes(); 
    for (AvailabilityType t : types) 
     selectItems.add(new SelectItem(t.getId(), t.getLabel() + (t.getName().equals("specific") ? " opleiding" : ""))); 

    return selectItems; 
} 

public String save() { 
    AvailabilityType defaultType = facilityManager.defaultAvailabilityType(); 
    if (defaultType == null) 
     return "showOrganisation"; 

    for (Iterator<OrganisationFacility> it = this.facilities.iterator(); it.hasNext();) { 
     OrganisationFacility f = it.next(); 

     //Business code omitted for readability 
     //At this point every f.AvailabilityType has already been duplicated from the last object in the datatable 
    } 

    return "showOrganisation"; 
} 
+0

Добавить '' 'в час: selectOneRadio' –

+0

Я попробовал , но это также имело некоторые проблемы. Спасибо за комментарий. Тем временем я придумал решение. Я добавлю это как ответ, если кто-то совершит ту же ошибку, что и я. –

ответ

0

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

Эта линия, казалось, преступник:

<h:selectOneRadio id="facility" value="#{orgFacility.availabilityType.id}"> 

кажется, что вложенные свойства не обрабатываются, как я ожидал. Я решил проблему, изменив метод getFindAllFacilitiesForCurrentOrganisation, чтобы вернуть список упрощенных объектов без каких-либо вложенных свойств. Вместо этого они просто содержат необходимые идентификаторы, которые я позже использую в методе «save» для выполнения фактического обновления. Так что теперь это выглядит следующим образом:

<h:selectOneRadio id="facility" value="#{orgFacility.typeId}"> 
Смежные вопросы