我正在使用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 />
,到目前为止还没有找到解决方案。
答案 0 :(得分:1)
谢谢你的帮助,伙计们。在你的帮助下我解决了这个问题。
就像其他人遇到类似的问题一样,这里有一些事情需要检查:
equals()
和hashCode()
。我的情况的解决方案实际上在@ irieill的评论中提到:
[..]不提供正确的转换器不会引发任何异常,但会面临错误消息。因此,请尝试在页面中添加
<p:growl autoUpdate="true" />
,以查看是否出现任何转化错误。如果是这样,请将适配器转换器添加到selectOneMenu
。
我想,这也是@BalusC在其可能原因列表第3点所说的内容。
另请参阅:How to write a custom converter for <p:pickList>
,Custom converter in JSF 2.0,PrimeFaces ShowCase: SelectOneMenu
答案 1 :(得分:0)
正如@BalusC在这篇文章中所提到的:commandLink/commandButton/ajax backing bean action/listener method not invoked
另请注意第1点。必须用<h:form />
标记将输入组件括起来。
好吧,我不想再次添加h:表单,因为它会导致未指定的行为。
据我了解,您滥用标签或者您不了解如何使用它。只需将整个页面(或至少所有输入组件)放在一个<h:form />
标记中,它就可以正常工作。
是否可以使用页面代码更新您的问题,该代码还包含您放置<h:form />
标记的行。