Ajax请求不更新bean

时间:2012-12-19 14:08:46

标签: jsf-2 primefaces

我有以下代码段(在h:body->h:form内,已使用h:head):

<p:dataTable id="items" value="#{faNav.faRequest.items}" var="_item" emptyMessage="#{dict['web.faRequest.noItems']}">
    <p:column>
        <h:inputText id="newItemName" value="#{_item.name}" rendered="#{_item.name eq null}"/>
    </p:column>
    <p:column>
-->         <p:spinner id="newItemQuantity" value="#{_item.quantity}"/>
    </p:column>
    <p:column>
        <p:commandButton value="Añadir" update="items" actionListener="#{faNav.addItem}" rendered="#{_item.name eq null}"/> 
    </p:column>
</p:dataTable>

bean中的函数:

public void addItem(ActionEvent actionEvent) {
    System.out.println("Añadiendo");
    this.faRequest.getItems().add(new RequestItem());       
}

现在,使用调试器检查函数内部的值。在那里,name属性已使用表单中的值进行更新,但quantity整数尚未更新。该属性是名称,因为如果我为数量设置了默认的非零值,则表单会正确显示它。

我在JBoss 7.1上使用Primefaces 3.4.2

我缺少什么?提前谢谢。

更新:从<p:spinner>切换到<h:inputText>根本没有帮助。

1 个答案:

答案 0 :(得分:0)

好的,我明白了,使用rendered属性的问题没有问题:

我得到的较小的SSCCE是

index3.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org /TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head/>
<h:body>
<h:form>
    <h:column>
        <h:inputText id="newItemName" value="#{faNav.item.name}"/>
    </h:column>
    <h:column>
        <h:inputText id="newItemQuantity" value="#{faNav.item.quantity}" rendered="#{faNav.item.name eq null}"/>
    </h:column>
    <h:column>
        <h:commandButton value="Añadir" actionListener="#{faNav.setItem}" rendered="#{!faNav.item.containsData}"/> 
    </h:column>
</h:form>
</h:body>
</html>

fixedAssetNav.java

@ManagedBean(name="faNav")
@ViewScoped
public class FixedAssetNav implements Serializable {

RequestItem item = new RequestItem();

public RequestItem getItem() {
    return this.item;
}

public void setItem(RequestItem item) {
    this.item = item;
}

public void setItem(ActionEvent actionEvent) {
    this.item.setContainsData(true);
    System.out.println("Setting " + this.item.getName() + " " + this.item.getQuantity());
}
}

RequestItem只是一个普通的bean,有两个String属性(namequantity)和一个布尔值(containsData)。

我发现通过更改.xhtml中的字段顺序(在newItemQuantity之前移动newItemName)确实解决了问题。此外,删除rendered的{​​{1}}属性或将表达式更改为newItemQuantity也有效。

我的猜测是,在应用值时,过程是:

1)检查是否呈现了true。 2)如果属性newItemName被更新。 3)检查是否呈现name 4)如果属性newItemQuantity已更新。

但是第3步检查了更新模型后的表达式(quantity,因此它突然变为false并跳过了第4步。

更方便的解决方法是检查属性的阶段:

faNav.item.name eq null