微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PrimeFaces inputText ajax event = valueChange在单击commandButton后触发

使用JSF和PrimeFaces 6.1我有一个inputText字段:

<p:inputText value="#{backingBean.stringField}">
    <p:ajax event="valueChange" update="@form" />
</p:inputText>

在同一个表单中是一个commandButton:

<p:commandButton id="btnDoThatThing" 
                 ajax="true" 
                 immediate="true"
                 update="@form"
                 process="@this"
                 action="#{backingBean.doThatThing}"/>

当我

>对inputText字段进行更改,
>然后单击命令按钮以外的其他位置
>单击命令按钮

一切都按预期完成.但如果我:

>对inputText字段进行更改,
>立即执行命令按钮

因为第一次单击commandButton而触发valueChange事件发生在inputText字段中,所以不会触发该按钮.

如果我第二次点击它,按钮动作终于发生了.

现在,如果我将p:ajax event =“valueChange”更改为p:ajax event =“keyup”,commandButton的第一次单击按预期工作,但不幸的是,inputField上的keyup事件非常hacky并且你在字段(复制/粘贴文本,文本选择,’快速’键入’等)

有关如何在inputText字段中启动change事件的任何想法,当用户在inputText字段中输入时立即单击按钮时,触发commandButton操作?

谢谢你的时间!

解决方法

首先触发valueChange.这会更新包含按钮的表单.不是100%确定这是否依赖于浏览器,但在Chromium(Linux)中,不执行单击先前渲染的按钮(在更新之前).

当我将更新表达式更改为selector时,我可以使它工作.我的表达式更新了我需要更新的元素,不包括按钮.就我而言:

<p:ajax update="@(form :input:not(button))" />

请注意,更改事件是输入的认值,因此我删除了event =“valueChange”.

当然,您不需要使用选择器.您还可以只更新不包含按钮的组件(如面板):

<p:ajax update="yourPanel" />

此外,ajax =“true”是p:commandButton的认值,因此您可以删除它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐