[英]Primefaces p:selectOneMenu or p:selectBooleanCheckbox not firing change-event depending on if I use h:form
我正在使用Primefaces 5.3。
首先,根据这篇文章,我实现了根据ap:selectBooleanCheckbox的值更改ap:selectOneMenu可见性的功能:
到目前为止,如果我使用h:form,则此方法有效。
接下来,我想更新p:selectOneMenu中选择的bean中的值。 这是我的问题开始的地方:即使我使用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的ap:tab中,其中“任务”是我的DataObject-List的变量。
如@BalusC在这篇文章中所提到的: 未调用commandLink / commandButton / ajax支持bean操作/侦听器方法 (可能的原因:2),
“您不能相互嵌套多个UIForm组件。”
因此,如果我删除h:form指令,则对Bean中的侦听器的调用有效。 但是现在,p:selectBooleanCheckbox的值始终设置为“ false”,因此该组件未更新为可见。
我在这里找到了一篇文章,其中OP存在相同的问题,并通过添加h:form指令解决了该问题。
编辑:我的“表单”是ui:composition,并且像这样<ui:composition template="/templates/pages/mainPage.xhtml">
,其中mainPage.xhtml包含h:head并包含“ header.xhtml”使用ui:include,并且有ah:form。 但是此h:form之前已经关闭,因此问题不在这里。
好吧,我不想再添加h:form,因为它会导致未指定的行为。 但是,如果我的p:selectBooleanCheckbox值设置不正确,那我在做什么错呢?
谢谢您的帮助!
更新
问题不是h:form,因为它实际上不是嵌套的。 现在,我仍然停留在p:selectOneMenu的监听器上,因为它们没有被调用。 我还尝试在<p:ajax />
上设置partialSubmit="true"
,但到目前为止还没有找到解决方案。
伙计们,谢谢您的帮助。 在您的帮助下,我解决了问题。
就像其他人遇到类似的问题一样,这里需要检查一些事项:
equals()
和hashCode()
。 @irieill的评论中实际上提到了针对我的情况的解决方案:
[..]不提供适当的转换器不会引发任何异常,但是会遇到错误消息。 因此,请尝试在页面上添加
<p:growl autoUpdate="true" />
,以查看是否出现任何转换错误。 如果是这样,请将propper转换器添加到selectOneMenu
。
我认为,这也是@BalusC在其可能原因列表的第3点说的话。
另请参阅: 如何为<p:pickList>
编写定制转换 器,JSF 2.0中的定制转换器 , PrimeFaces ShowCase:SelectOneMenu
就像@BalusC在这篇文章中提到的那样: 未调用commandLink / commandButton / ajax支持bean操作/侦听器方法
还要注意第1点。您必须使用<h:form />
标记将输入组件括起来。
好吧,我不想再添加h:form,因为它会导致未指定的行为。
据我了解,您正在滥用标签,或者您不知道如何使用它。 只需将整个页面(或至少所有输入组件)封装在一个<h:form />
标记中,它就可以工作。
您能否用页面代码更新您的问题,该页面代码还包含放置<h:form />
标记的行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.