2012-12-19 48 views
0

我有下面的代码片段(内h:body->h:formh:head已使用)豆:在beanAjax请求没有更新

<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> 

而且功能:

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我缺少什么?提前致谢。

UPDATE:从切换到<p:spinner><h:inputText>没有帮助的。

+0

并当您尝试'更新=“@形式”'工作? – fischermatte

+0

@fischermatte:OP检查了动作侦听器方法中的模型值,所以ajax渲染是不相关的。至于可能的'update ='items''在数据表上失败,这在PF 3.3中得到了修复,并且OP在使用3.4.2。 – BalusC

+0

@fischermatte我终于找到了它,如果你想检查答案。无论如何感谢你的努力。 – SJuan76

回答

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> 

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只是一个普通的一个具有两个字符串属性(namequantity)和一个布尔值(containsData)。

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

我的猜测是,将值时,该程序是:

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)}"/>