2013-11-10 4 views
1

У меня есть p: selectOneMenu, все значения просматриваются правильно, но только первый в моем списке можно выбрать, например, в моем списке у меня есть адреса электронной почты, я могу выбрать все, кроме почты, отправляются только по первому из них в списке. Мой JSF код:


p: selectOneMenu получить только первое значение из списка праймеров JSF

<p:dataTable value="#{additionalOrdersBean.additionalOrdersList}" 
var="additionalOrders" rowIndexVar="lp" id="myTable" editable="true> 
    <p:column> 
     <p:selectOneMenu id="recipient" value="#{additionalOrdersBean.mailTo}" converter="#{mailConverter}" required="true" requiredMessage="#{loc['fieldRequired']}"> 
      <f:selectItems value="#{buildingBean.buildingList2}" var="mail" itemLabel="#{mail.mail1}" itemValue="#{mail.mail1}" /> 
      <f:selectItems value="#{buildingBean.buildingList2}" var="mail" itemLabel="#{mail.mail2}" itemValue="#{mail.mail2}" /> 
      <f:selectItems value="#{buildingBean.buildingList2}" var="mail" itemLabel="#{mail.mail3}" itemValue="#{mail.mail3}" /> 
     </p:selectOneMenu> 
     <h:message for="recipient" style="color:red"/> 
     <h:commandButton value="#{loc['send']}" action="#{additionalOrdersBean.sendProtocol()}" onclick="sendProtocolDialog.hide()"/> 
    </p:column> 
</p:dataTable> 


Мой боб:

private String mail1; 
private String mail2; 
private String mail3; 

public List<Building> getBuildingList2() { 
    buildingList2 = getBldRepo().findByLocationId(lid); 
    return buildingList2; 
} 



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

+0

Не уверен в вашей текущей проблеме, но я просто могу сказать, что вам нужно удалить бизнес-логику в 'getBuildingList2', так как она называется несколько раз. См. Http://stackoverflow.com/q/2090033/1065197. Вероятно, это решение может решить и вашу текущую проблему. –

+0

Но когда я положил его в p: диалог работает нормально, только в p: dataTable нет. – 4Money

+0

Вы прочитали ссылку и поняли проблему? –

ответ

0

Вы, кажется, ожидаете, что при нажатии командной кнопки в строке отображается только текущая строка. Это неверно. Командная кнопка представляет всю форму. В вашем конкретном случае форма обертывает всю таблицу, и, таким образом, выпадающее меню в каждой строке отправляется.

Однако атрибут value всех этих выпадающих списков привязан к одному и тому же компоненту bean вместо текущей итерированной строки.

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

У вас здесь принципиальная ошибка дизайна и фундаментальное непонимание того, как работают основные HTML-формы. Вам в основном нужно переместить форму внутри ячейки таблицы, чтобы отправлять только данные, содержащиеся в одной и той же ячейке, на сервер.

<p:dataTable ...> 
    <p:column> 
     <h:form> 
      ... 
     </h:form> 
    </p:column> 
</p:dataTable> 

Если это дизайн технически не вариант (например, потому что вы имеете входы в других клетках того же ряда, или за пределами таблицы, которые также должны быть отправлены), то вы должны были бы связать атрибут в настоящее время повторного ряда value вместо и передать именно эту строку в метод действия кнопки команды в:

<p:dataTable value="#{additionalOrdersBean.additionalOrdersList}" var="additionalOrders" ...> 
    <p:column> 
     <p:selectOneMenu value="#{additionalOrders.mailTo}" ...> 
      ... 
     </p:selectOneMenu> 
     ... 
     <h:commandButton value="#{loc['send']}" action="#{additionalOrdersBean.sendProtocol(additionalOrders)}" ... /> 
    </p:column> 
</p:dataTable> 

Это, кстати, не самодокументированны и довольно запутанным, чтобы иметь множественное число от имени var. Не могли бы вы назвать его additionalOrder? Или класс javabean/entity, представляющий один дополнительный заказ, действительно названный AdditionalOrders?


Unrelated к конкретной задаче: делать бизнес-логику в методах геттерных убивает приложения. Просто не делай этого. См. Также Why JSF calls getters multiple times.

+0

Спасибо, это было очень полезно!:) – 4Money

+0

Добро пожаловать. – BalusC

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