Primefaces p:selectOneMenu 或 p:selectBooleanCheckbox 不触发更改事件,具体取决于我是不是使用 h:form
Posted
技术标签:
【中文标题】Primefaces p:selectOneMenu 或 p:selectBooleanCheckbox 不触发更改事件,具体取决于我是不是使用 h:form【英文标题】:Primefaces p:selectOneMenu or p:selectBooleanCheckbox not firing change-event depending on if I use h:formPrimefaces p:selectOneMenu 或 p:selectBooleanCheckbox 不触发更改事件,具体取决于我是否使用 h:form 【发布时间】:2016-11-21 03:59:08 【问题描述】:我正在使用 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 指令解决了它。
编辑:
我的“表单”是一个 ui:composition,以 <ui:composition template="/templates/pages/mainPage.xhtml">
开头,其中 mainPage.xhtml 包含 h:head 并使用 ui:include 包含“header.xhtml”,并且有一个 h:form。但是这个 h:form 之前已经关闭了,所以问题不在这里。
好吧,我不想再次添加 h:form,因为它会导致未指定的行为。但是,如果我的 p:selectBooleanCheckbox 值设置不正确,我做错了什么?
感谢您的帮助!
更新
问题不在于 h:form,因为它实际上没有嵌套。现在我仍然坚持 p:selectOneMenu 的侦听器,因为它们没有被调用。我还尝试在<p:ajax />
上设置partialSubmit="true"
,但到目前为止还没有解决。
【问题讨论】:
selectedParentTask
上是否有 setter/getter?您的侦听器方法taskToAddListener
看起来如何?您是否尝试过使用p:remoteCommand
?
@chaeschuechli 是的,我有 getter/setter 和监听器的签名看起来像这样:public void taskToAddListener(AjaxBehaviorEvent event)
。但问题在于 p:selectBooleanCheckbox (task.dependsOn),其值始终设置为“false”。自从我摆脱了 h:form 以来,它不再与 selectedParentTask 一起使用。我刚刚使用 p:remoteCommand <p:remoteCommand id="rm" actionListener="#schedulerCDIBean.taskToAddListener"/> <f:ajax event="change" onevent="rm"/>
尝试了以下方法,但也没有用。感谢您的帮助
在你的 标签内部 selectBooleanCheckbox 你必须调用一个监听器方法来更新布尔值。
感谢您的评论。我在我的 selectBooleanCheckbox 中添加了一个<p:ajax listener="bean.myListener"/>
,被调用的监听器看起来像这样:public void myListener() System.out.println("state is: " + editingTask.isDependsOn());
。输出仍然总是“状态为:假”。
一种完全不同的方法(因为我几分钟前在我的项目中遇到过它):似乎您的项目是复杂的对象类型,因此丢失的转换器可能是可能的问题。我注意到,不提供适当的转换器不会引发任何异常,但会面临错误消息。因此,请尝试将 谢谢你们的帮助,伙计们。在你的帮助下,我解决了这个问题。
就像其他人遇到类似问题一样,这里有几件事要检查:
-
检查@BalusC 的回答here,@irieill 的回答中也提到过。
检查您是否有
equals()
和 hashCode()
您愿意在 selectOneMenu 中显示的对象。
@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
【讨论】:
【参考方案2】:正如@BalusC 在这篇文章中提到的:commandLink/commandButton/ajax backing bean action/listener method not invoked
还请注意第 1 点。您必须用<h:form />
标签括起您的输入组件。
好吧,我不想再添加 h:form,因为它会导致未指定的行为。
据我了解,您误用了该标签,或者您不了解如何使用它。只需将整个页面(或至少所有输入组件)包含在一个 <h:form />
标记中,它就可以工作了。
您能否使用包含您放置<h:form />
标记的行的页面代码更新您的问题。
【讨论】:
以上是关于Primefaces p:selectOneMenu 或 p:selectBooleanCheckbox 不触发更改事件,具体取决于我是不是使用 h:form的主要内容,如果未能解决你的问题,请参考以下文章
使用ajax从jsf中的primefaces树选定项设置primefaces selectOneMenu默认值
在 PrimeFaces 中添加 Angular Js - JSF