В моем коде у меня есть следующие объекты для реализации корзины:
public class CartItem {
...
public int id;
public int quantity;
...
}
public class Partner {
...
public List<CartItem> listOfItems;
...
}
public class Cart implements Serializable {
...
private List<Partner> listOfPartners;
...
}
На странице ViewCart.xhtml я перечисляю элементы следующим образом:
...
<ui:repeat value="#{cartManagedBean.cart.listOfPartners}" var="p">
<ui:repeat value="#{p.listOfItems}" var="i">
<h:form>
...
<h:inputText size="3" value="#{i.quantity}" />
<h:commandButton value="Update" />
...
</h:form>
</ui:repeat>
</ui:repeat>
...
А это мой ManagedBean:
@ManagedBean
@SessionScoped
public class CartManagedBean {
...
private Cart cart;
...
}
Все методы получения и установки правильно выполнены. Следовательно, я ожидал, что когда я нажму кнопку обновления, количество соответствующего элемента будет обновлено. Однако, когда я проверяю функцию, только последний элемент в списке может быть обновлен.
Буду очень признателен, если кто-нибудь даст мне совет о том, как мне решить эту проблему.
ОБНОВЛЕНИЕ: Мне удалось заставить его работать, заменив ui:repeat
на h:dataTable
. Я думаю, что мое знание ui:repeat
должно быть где-то неправильно. Когда я использовал ui:repeat
, я увидел, что сгенерированный HTML-код выглядит примерно так:
<form>
...
<input type="submit" id="jdt:51;jdt52" />
...
</form>
<form>
...
<input type="submit" id="jdt:51;jdt52" />
...
</form>
Другими словами, все элементы были созданы с одинаковым идентификатором. Я даже пытался сделать идентификатор ввода для количества уникальным, добавив уникальный идентификатор каждого элемента к идентификатору ввода следующим образом:
<h:inputText id="quantity#{i.id}" size="3" value="#{i.quantity}" />
Однако в результате HTML я увидел, что идентификатор был что-то вроде:
<form>
...
<input type="submit" id="jdt:51;jdt52;quantity203" />
...
</form>
<form>
...
<input type="submit" id="jdt:51;jdt52;quantity203" />
...
</form>
Другими словами, идентификатор 1-го предмета был повторен для всех последующих предметов. Хотя я не до конца понял, как переменные обновляются с новыми значениями, я думаю, что это причина, по которой только последний элемент может быть обновлен.
Я был бы очень признателен, если бы кто-то мог объяснить мне это дальше, чтобы я не повторил ту же ошибку снова =).