使用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}"/>
当我
一切都按预期工作。但是如果我:
该按钮未触发,因为commandButton的第一次单击触发了valueChange事件在inputText字段中发生。
如果我第二次单击它,按钮动作最终会发生。
现在,如果我按预期的那样将commandButton 更改p:ajax event="valueChange"为p:ajax event="keyup"第一次单击,则可正常工作,但是不幸的是,inputField上的keyup事件非常hacky,并且您失去了该字段内的功能(复制/粘贴文本,文本选择,“快速”键入等) )
p:ajax event="valueChange"
p:ajax event="keyup"
关于如何在inputText字段中启动change事件,以及当用户在inputText字段中键入后立即单击按钮时,如何触发commandButton动作有任何想法?
谢谢你的时间!
首先,您的valueChange被触发。这将更新 包含 按钮的表单。无法100%确定这是否取决于浏览器,但是在Chromium(Linux)中,不会执行对先前呈现的按钮(在更新之前)的单击。
valueChange
将更新表达式更改为选择器时,可以使它工作。我的表达式会更新需要更新的元素( 不包括 按钮)。就我而言:
<p:ajax update="@(form :input:not(button))" />
请注意,该change事件是输入的默认事件,因此已删除event="valueChange"。
change
event="valueChange"
当然,您不需要使用选择器。您也可以只更新不包含按钮的组件(如面板):
<p:ajax update="yourPanel" />
另外,ajax="true"的默认设置p:commandButton,因此您可以将其删除。
ajax="true"
p:commandButton