0

我有以下片段(里面h:body->h:formh: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>根本没有帮助。

4

1 回答 1

0

好的,我明白了,primefaces 没有问题,但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>

固定资产导航.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只是一个具有两个字符串属性(namequantity)和一个布尔属性()的普通bean containsData

我发现通过更改 .xhtml 中字段的顺序(移到newItemQuantity前面newItemName)确实解决了这个问题。此外,删除rendered属性newItemQuantity或将表达式更改为truedid 也有效)。

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

1)检查是否newItemName被渲染。2) 如果是,name则更新属性。3) 检查是否newItemQuantity已渲染 4) 如果是,quantity则更新属性。

但是第3步在更新模型后检查了表达式(faNav.item.name eq null),所以突然为假,跳过第4步。

解决这个问题的一种更方便的方法是检查属性的相位:

        <h:inputText id="newItemQuantity" value="#{faNav.item.quantity}" rendered="#{(faNav.item.name eq null) || (facesContext.currentPhaseId.ordinal ne 6)}"/>
于 2012-12-20T14:22:22.907 回答