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,以 &lt;ui:composition template="/templates/pages/mainPage.xhtml"&gt; 开头,其中 mainPage.xhtml 包含 h:head 并使用 ui:include 包含“header.xhtml”,并且有一个 h:form。但是这个 h:form 之前已经关闭了,所以问题不在这里。

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

感谢您的帮助!

更新

问题不在于 h:form,因为它实际上没有嵌套。现在我仍然坚持 p:selectOneMenu 的侦听器,因为它们没有被调用。我还尝试在&lt;p:ajax /&gt; 上设置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 &lt;p:remoteCommand id="rm" actionListener="#schedulerCDIBean.taskToAddListener"/&gt; &lt;f:ajax event="change" onevent="rm"/&gt; 尝试了以下方法,但也没有用。感谢您的帮助 在你的 标签内部 selectBooleanCheckbox 你必须调用一个监听器方法来更新布尔值。 感谢您的评论。我在我的 selectBooleanCheckbox 中添加了一个&lt;p:ajax listener="bean.myListener"/&gt;,被调用的监听器看起来像这样:public void myListener() System.out.println("state is: " + editingTask.isDependsOn()); 。输出仍然总是“状态为:假”。 一种完全不同的方法(因为我几分钟前在我的项目中遇到过它):似乎您的项目是复杂的对象类型,因此丢失的转换器可能是可能的问题。我注意到,不提供适当的转换器不会引发任何异常,但会面临错误消息。因此,请尝试将 添加到您的页面,以查看是否引发任何转换错误。如果是这样,请在您的 selectOneMenu 中添加一个适当的转换器。 【参考方案1】:

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

就像其他人遇到类似问题一样,这里有几件事要检查:

    检查@BalusC 的回答here,@irieill 的回答中也提到过。 检查您是否有 equals()hashCode() 您愿意在 selectOneMenu 中显示的对象。

@irieill 的评论中实际上提到了我的情况的解决方案:

[..]不提供适当的转换器不会引发任何异常,但会面临错误消息。因此,请尝试将&lt;p:growl autoUpdate="true" /&gt; 添加到您的页面以查看是否引发任何转换错误。如果是这样,请向您的 selectOneMenu 添加一个适当的转换器。

我认为,这也是@BalusC 在他的可能原因列表的第 3 点所说的。

另请参阅:How to write a custom converter for &lt;p:pickList&gt;、Custom converter in JSF 2.0、PrimeFaces ShowCase: SelectOneMenu

【讨论】:

【参考方案2】:

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

还请注意第 1 点。您必须&lt;h:form /&gt; 标签括起您的输入组件。

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

据我了解,您误用了该标签,或者您不了解如何使用它。只需将整个页面(或至少所有输入组件)包含在一个 &lt;h:form /&gt; 标记中,它就可以工作了。

您能否使用包含您放置&lt;h:form /&gt; 标记的行的页面代码更新您的问题。

【讨论】:

以上是关于Primefaces p:selectOneMenu 或 p:selectBooleanCheckbox 不触发更改事件,具体取决于我是不是使用 h:form的主要内容,如果未能解决你的问题,请参考以下文章

实现PrimeFaces扩展时出错

使用ajax从jsf中的primefaces树选定项设置primefaces selectOneMenu默认值

JSF 2 PrimeFaces 安装

在 PrimeFaces 中添加 Angular Js - JSF

IBM Bluemix 支持 Primefaces? [关闭]

Primefaces 6.0 对话框框架和框架集