Primefaces p:selectOneMenu或p:selectBooleanCheckbox不会触发change-event,具体取决于我是否使用h:form

时间:2016-07-18 13:51:19

标签: ajax jsf primefaces

我正在使用Primefaces 5.3。

首先,我根据这篇文章实现了根据p:selectBooleanCheckbox的值改变p:selectOneMenu的可见性的功能:

Enabling and disabling components via select checkbox

到目前为止,如果我使用h:form。

接下来,我想更新bean中的值,如p:selectOneMenu中所选。这是我的问题开始的地方:即使我使用p:ajax显式调用一个监听器,它也不会被调用。这是我的代码:

 <h:panelGrid>
            <p:selectOneMenu value="#{schedulerCDIBean.selectedParentTask}" var="parentTask"  id="taskDependence" disabled="#{task.dependsOn != 'true'}">

                <p:ajax  event="change" listener="#{schedulerCDIBean.taskToAddListener}"/>

                <f:selectItems id="taskDependenceItems" value="#{schedulerCDIBean.taskWebDataObjectList}"   var="item" itemLabel="#{item.taskName}" 
                itemValue="#{item}"  />

               <p:column>
                   <h:outputText value="#{parentTask}"/>
               </p:column>

    </p:selectOneMenu>
</h:panelGrid>

以下是我启用/禁用selectOneMenu的方法:

<p:selectBooleanCheckbox id="dependsOnTask" value="#{task.dependsOn}" itemLabel="Depends On">       
        <p:ajax update="taskDependence" process="@this"/>
</p:selectBooleanCheckbox>

所有这些都存在于p:accordionPanel的p:tab中,其中'task'是我的DataObject-List的var。

正如@BalusC在这篇文章中提到的:commandLink/commandButton/ajax backing bean action/listener method not invoked(可能的原因:2),

  

“您不能将多个UIForm组件嵌套在一起。”

因此,如果我删除了h:form指令,则调用bean中的侦听器。但是现在,p:selectBooleanCheckbox的值总是设置为'false',因此组件没有更新为可见。

我找到了帖子here,其中OP遇到了同样的问题,并通过添加h:form指令解决了这个问题。

编辑: 我的'form'是一个ui:composition并且像这样<ui:composition template="/templates/pages/mainPage.xhtml">开始,其中mainPage.xhtml包含h:head并使用ui:include包含'header.xhtml',并且有一个h:form。但是这个h:表单之前已经关闭了,所以问题不在这里。

好吧,我不想再次添加h:表单,因为它会导致未指定的行为。但是,如果我的p:selectBooleanCheckbox值未正确设置,我做错了什么?

感谢您的帮助!

更新

问题不在于h:表单,因为它实际上没有嵌套。现在我仍然坚持使用p:selectOneMenu的监听器,因为它们没有被调用。我还尝试在partialSubmit="true"上设置<p:ajax />,到目前为止还没有找到解决方案。

2 个答案:

答案 0 :(得分:1)

谢谢你的帮助,伙计们。在你的帮助下我解决了这个问题。

就像其他人遇到类似的问题一样,这里有一些事情需要检查:

  1. 检查@ BalusC的回答here,同样在@ irieill的回答中提到。
  2. 检查您是否愿意在selectOneMenu中显示对象的equals()hashCode()
  3. 我的情况的解决方案实际上在@ irieill的评论中提到:

      

    [..]不提供正确的转换器不会引发任何异常,但会面临错误消息。因此,请尝试在页面中添加<p:growl autoUpdate="true" />,以查看是否出现任何转化错误。如果是这样,请将适配器转换器添加到selectOneMenu

    我想,这也是@BalusC在其可能原因列表第3点所说的内容。

    另请参阅:How to write a custom converter for <p:pickList>Custom converter in JSF 2.0PrimeFaces ShowCase: SelectOneMenu

答案 1 :(得分:0)

  

正如@BalusC在这篇文章中所提到的:commandLink/commandButton/ajax backing bean action/listener method not invoked

另请注意第1点。必须<h:form />标记将输入组件括起来。

  

好吧,我不想再次添加h:表单,因为它会导致未指定的行为。

据我了解,您滥用标签或者您不了解如何使用它。只需将整个页面(或至少所有输入组件)放在一个<h:form />标记中,它就可以正常工作。

是否可以使用页面代码更新您的问题,该代码还包含您放置<h:form />标记的行。