【问题标题】:PrimeFaces selectOneMenu have null new value in both valueChangeListener and ajax listenerPrimeFaces selectOneMenu 在 valueChangeListener 和 ajax 侦听器中都有 null 新值
【发布时间】:2014-11-13 21:27:54
【问题描述】:

我遇到了 PrimeFaces 的问题。这是我的 XHTML 代码:

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

这是我的 bean 代码:

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 方法都为新值获得了“null”(使用调试器,我可以看到 ValueChangeEvent 中的旧值是“0”,根据我的 selectItems 是正确的)。

有什么线索可以解决这个问题吗?我真的不明白,我在这个网站上看到了我多次使用的代码......

技术信息:JBoss EAP 6.0、Mojarra 2.1.7-jboss、PrimeFaces 4.0

编辑:我想知道这是否是嵌入在 JBoss 中的 jsf-impl 库中的错误。我更新到 Mojarra 2.1.18-jboss,但问题完全相同:ajax 侦听器将null 值放入我的grille 对象中,getNewValue() 对象也返回了nullvalueChangeEvent.

【问题讨论】:

    标签: jsf-2 primefaces selectonemenu valuechangelistener


    【解决方案1】:

    首先,我认为您的 f:selectItems 标签有问题。尝试为其设置 itemValue 和 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?

    如果这不能解决您的问题,您可以尝试在您的 jsf 页面中放置一个 p:messages 标签。可能存在未显示在控制台中的错误。

    【讨论】:

    • 我的代码中有两个不同的问题,一个在我提供的代码中不可见。您对getSubmittedValue() 的看法是正确的,它确实总是null,因为AjaxBehaviorEvent 在更新模型值阶段之后被触发。我必须直接从我的模型中检索选定的 id。就我的selectItems 而言,这不是问题,因为我的getBranche() 方法有这个签名:public List&lt;SelectItem&gt; getBranche() {
    • 问题的第二部分是我的p:dialog 在页面中没有任何形式。由于某些原因,我不得不将我的p:confirmDialog 置于任何形式。我想我应该对dialog 做同样的事情,这确实是个坏主意。在表单之外,没有值被提交给服务器。从我提供的代码中看不到这部分。
    猜你喜欢
    • 2014-01-28
    • 2014-09-10
    • 2013-02-04
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多