我有以下代码段(在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>
根本没有帮助。
答案 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属性(name
和quantity
)和一个布尔值(containsData
)。
我发现通过更改.xhtml中的字段顺序(在newItemQuantity
之前移动newItemName
)确实解决了问题。此外,删除rendered
的{{1}}属性或将表达式更改为newItemQuantity
也有效。
我的猜测是,在应用值时,过程是:
1)检查是否呈现了true
。
2)如果属性newItemName
被更新。
3)检查是否呈现name
4)如果属性newItemQuantity
已更新。
但是第3步检查了更新模型后的表达式(quantity
),因此它突然变为false并跳过了第4步。
更方便的解决方法是检查属性的阶段:
faNav.item.name eq null