p:datatable中的更新行未显示期望值

时间:2019-10-11 13:35:03

标签: jsf primefaces datatable

我有一个p:dataTable。它包含项目列表。项属于Java Bean类“ Item.java”类。它具有3个属性:id(整数,唯一标识符),名称(字符串),值(整数),getter和setter。数据表有3列:

  1. 项目名称

  2. 商品价值

  3. p:commandButton,值为“更改”;按下按钮时,将显示p:对话框,其中包含一条消息(您要更新#{i.name}),h:inputText(必须在其中添加新值)和Submit按钮。当我按下“提交”时,它在类ItemsView.java中称为方法“ changeValue(Item item)”。

此刻,p:datatable包含3个项目,“ item1”,“ item2”,“ item3”,并且都具有值0。我想将值“ 5”更新为“ item2”。当它被称为方法“ 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>

以及与dataTable关联的Java类:

@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更改项目的值时,即“ System.out.println(item.getValue());”行。将显示“ 5”。出于业务逻辑原因,我不想直接在单元格中更改该值(无p:dialog)。

0 个答案:

没有答案