Обновление строки в p: datatable не отображает ожидаемое значение - PullRequest
0 голосов
/ 11 октября 2019

У меня есть ap: dataTable. Содержит список предметов. Элементы принадлежат классу Item.java, который является классом Java-бина. Он имеет 3 атрибута: идентификатор (целое число, уникальный идентификатор), имя (строка), значение (целое число), методы получения и установки. У таблицы данных есть 3 столбца:

  1. название элемента

  2. значение элемента

  3. p:commandButton со значением «Изменить»;при нажатии на кнопку отображается диалоговое окно ap :, которое содержит сообщение (вы хотите обновить # {i.name}), h: inputText, где мне нужно ввести новое значение, и кнопку подтверждения. Когда я нажимаю «submit», он вызывается методом «changeValue (Item item)» из класса ItemsView.java.

В этот момент таблица p: datatable содержит 3 элемента: «item1», «item2», «item3», и все они имеют значение 0. Я хочу обновить «item2»со значением "5". Когда вызывается метод "changeValue (Item item)", этот элемент является правильным, но значение по-прежнему равно 0, а обновление не выполняется.

Вот страница xhtml и класс Java:

<h:body>
<h:form id="listItemsForm" prependId="false">
    <p:dataTable id="itemEntitiesTable" var="i" value="#{itemsView.items}">
        <p:column headerText="Name">
            <h:outputText value="#{i.name}" />
        </p:column>
        <p:column headerText="Value">
            <h:outputText value="#{i.value}" />
        </p:column>
        <p:column headerText="Update value">
            <p:commandButton value="Change" onclick="PF('changeValue#{i.id}').show();" >
                <f:setPropertyActionListener target="#{itemsView.selectedItem}" value="#{i}"/>
            </p:commandButton>
                <p:dialog header="Update value" widgetVar="changeValue#{i.id}" modal="true" height="150" >
                    You want to update #{i.name}
                    <br/><br/>
                    <h:outputLabel value="New value: * " />  
                    <h:inputText id="itemValue" required="true" label="itemValue" value="#{i.value}" />
                    <br/><br/>
                    <h:commandButton type="submit" id="updateItem" value="Change" action="#{itemsView.changeValue(i)}" />
                </p:dialog>
        </p:column>
    </p:dataTable>
</h:form>
</h:body>

И класс Java, связанный с dataTable:

@ManagedBean
@ViewScoped
public class ItemsView implements Serializable {

private List<Item> items;

@ManagedProperty("#{selectedItem}")
private Item selectedItem;

@PostConstruct
public void init() {
    items = // a list of 3 items - ("item1", 0), ("item2", 0), ("item3", 0)
}

// getters and setters

public String changeValue(Item item) {

    System.out.println(item.getName());    // name of the selected item, which is correct
    System.out.println(item.getValue());   // 0 (the old value, not 5, as I expected)  

    // some code, to persist the new value in database, not relevant for this question

    return "success";
}
}

Для меня область действия в этот момент - когда я меняю значение для элемента с 5, строка «Система».out.println (item.getValue ());»будет отображаться «5». По причинам бизнес-логики я не хочу изменять значение непосредственно в ячейке (без p: диалогового окна).

...