2014-09-19 24 views
0

我遇到了PrimeFaces的问题。这里是我的XHTML代码:PrimeFaces selectOneMenu在valueChangeListener和ajax监听器中都有空的新值

<p:selectOneMenu value="#{gCnewObjectBean.grille.branche}" 
    valueChangeListener="#{gCnewObjectBean.brancheChangedListener}" 
    update=":contentform :popup"> 
    <f:selectItems value="#{gCnewObjectBean.branche}" /> 
    <p:ajax update=":contentform :popup" 
     listener="#{gCnewObjectBean.brancheChangedListener}" /> 
</p:selectOneMenu> 

这里是我的豆代码:

public void brancheChangedListener(ValueChangeEvent event) { 
    Integer branche = (Integer) event.getNewValue(); 
    // do populate the second select menu based on this value 
} 
public void brancheChangedListener(AjaxBehaviorEvent event) { 
    SelectOneMenu selectMenu = (SelectOneMenu) event.getSource(); 
    Integer branche = (Integer) selectMenu.getSubmittedValue(); 
    // do populate the second select menu based on this value 
} 

生成的HTML代码是有点怪与primefaces的HTML选择组件是隐藏的。但是,如果我与萤火虫看到它,它看起来像这样:

<select id="branche_input" name="branche_input"> 
    <option value="0"></option> 
    <option value="1">Prestations prévoyance professionnelle</option> 
    <option value="2">Prestations prévoyance privée</option> 
    <option value="3">Prestations PRIRENT</option> 
    <option value="4">Gestion prévoyance professionnelle</option> 
</select> 

这个代码是测试由BalusC上this post描述的两种解决方案(valueChangeListenerf:ajax)的方式。

当我改变选择菜单中的值时,两个监听器都被触发,首先是valueChangeEvent,然后是AjaxBehaviorEvent,这完全是我基于BalusC后期发现的。但是这两种bean方法对于新值都会得到一个“空值”(使用调试器,我可以看到ValueChangeEvent中的旧值为“0”,根据我的selectItems,这是正确的)。

解决此问题的任何线索?我真的不明白,我看见我使用几个时间在这个网站的代码...

技术信息:JBoss的EAP 6.0,钻嘴鱼科2.1.7-JBoss的,PrimeFaces 4.0

编辑:我是想知道这是否是JBoss中嵌入的jsf-impl库中的一个bug。我更新到Mojarra 2.1.18-jboss,但问题是严格相同的:一个null值通过ajax监听器放入我的grille对象中,并且getNewValue()对象也返回对象的valueChangeEvent

回答

1

首先,我认为你的f:selectItems标签有问题。尝试设置项目值,并为它itemLabel属性:(?我觉得gCnewObjectBean.branche不是integerList,是)

<p:selectOneMenu value="#{gCnewObjectBean.grille.branche}" 
    valueChangeListener="#{gCnewObjectBean.brancheChangedListener}" 
    update=":contentform :popup"> 
    <f:selectItems value="#{gCnewObjectBean.brancheList}" var="item" 
     itemValue="#{item.branche}" itemLabel="#{item.label}"/> 
    <p:ajax update=":contentform :popup" 
    listener="#{gCnewObjectBean.brancheChangedListener}" /> 

您尝试与getSubmittedValue获取所选值()方法无法工作。 getSubmittedValue没有返回你期望的值:

Why can I not get the submitted value from component binding?

如果这不是解决你的问题,你可以尝试把一个p:messages标签在你的JSF页面。可能有错误不会显示在控制台中。

+0

我的代码中存在两个不同的问题,一个用我提供的代码不可见。你对'getSubmittedValue()'是正确的,它确实总是'null',因为在更新模型值阶段之后触发'AjaxBehaviorEvent'。我必须直接从我的模型中检索选定的ID。至于我的'selectItems',那不是问题,因为我的'getBranche()'方法有这样的签名:'public List getBranche(){' – Wis 2014-09-23 08:15:12

+0

问题的第二部分是我的'p:dialog'是不以任何形式在页面中。出于某些原因,我必须将我的'p:confirmDialog'放在任何形式之外。我认为我应该对'对话框做同样的事情,这确实是一个坏主意。在表单之外,没有值被提交给服务器。从我提供的代码中看不到这部分。 – Wis 2014-09-23 08:18:01

相关问题