JSF 2.0: почему объект в моем списке (кроме последнего) не может быть обновлен - PullRequest
2 голосов
/ 10 ноября 2011

В моем коде у меня есть следующие объекты для реализации корзины:

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-го предмета был повторен для всех последующих предметов. Хотя я не до конца понял, как переменные обновляются с новыми значениями, я думаю, что это причина, по которой только последний элемент может быть обновлен.

Я был бы очень признателен, если бы кто-то мог объяснить мне это дальше, чтобы я не повторил ту же ошибку снова =).

1 Ответ

0 голосов
/ 11 ноября 2011

Вы, кажется, используете Мохарру. <ui:repeat> является полностью сломанным в Мохарре. Я могу воспроизвести вашу проблему даже на последней Мохарре 2.1.4. Однако он работает на 100% при использовании MyFaces 2.1.3 . Я сообщил об этом ребятам из Мохарры как выпуск 2243 .

У вас есть 3 варианта:

  • Замени Мохарру на MyFaces.
  • Используйте <c:forEach> вместо <ui:repeat>. Это работает, только если <c:forEach> не находится внутри какого-либо компонента UIData.
  • Используйте компонент UIData вместо <ui:repeat>.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...