rus*_*ert 4 ajax jsf primefaces jsf-2
使用JSF和PrimeFaces 6.1我有一个inputText字段:
<p:inputText value="#{backingBean.stringField}">
<p:ajax event="valueChange" update="@form" />
</p:inputText>
Run Code Online (Sandbox Code Playgroud)
在同一个表单中是一个commandButton:
<p:commandButton id="btnDoThatThing"
ajax="true"
immediate="true"
update="@form"
process="@this"
action="#{backingBean.doThatThing}"/>
Run Code Online (Sandbox Code Playgroud)
当我
一切都按预期完成.但如果我:
因为第一次单击commandButton会触发inputText字段中发生的valueChange事件,因此不会触发该按钮.
如果我第二次点击它,按钮动作终于发生了.
现在,如果我按照预期更改p:ajax event="valueChange"到p:ajax event="keyup"commandButton工作的第一次单击,但不幸的是,inputField上的keyup事件非常hacky并且你在该字段中丢失了功能(复制/粘贴文本,文本选择,'快速'输入'等)
有关如何在inputText字段中启动change事件的任何想法,当用户在inputText字段中输入时立即单击按钮时,触发commandButton操作?
谢谢你的时间!
首先你valueChange被触发了.这会更新包含按钮的表单.不是100%确定这是否依赖浏览器,但在Chromium(Linux)中,不执行单击先前渲染的按钮(在更新之前).
当我将更新表达式更改为选择器时,我可以使它工作.我的表达式更新了我需要更新的元素,不包括按钮.就我而言:
<p:ajax update="@(form :input:not(button))" />
Run Code Online (Sandbox Code Playgroud)
请注意,该change事件是输入的默认值,因此我已将其删除event="valueChange".
当然,您不需要使用选择器.您还可以只更新不包含按钮的组件(如面板):
<p:ajax update="yourPanel" />
Run Code Online (Sandbox Code Playgroud)
此外,ajax="true"是a的默认值p:commandButton,因此您可以删除它.