我需要在更改文本框时触发 ajax 更新,这是一个<p:autoComplete>
成分。我观察到,如果用户选择手动键入文本,则事件是更改,而如果用户单击自动完成的建议之一,则事件是 itemSelect。所以我添加了两个<p:ajax>
输入的子级,每个子级调用相同的方法并具有相同的更新列表,但其中一个具有event="change"
和另一个event="itemSelect"
.
然而,我现在发现了一些奇怪的事情。例如,在正常服务器模式下,我打开页面并输入“12”。自动完成功能提供“1233”和“1234”作为建议。我点击“1233”,似乎什么也没发生。我再次点击,其他所有内容都填满了。
在事件处理程序上使用断点在调试器中重复此操作,我可以看到第一次单击后,该值为“12”,第二次单击时,该值变为“1233”。
通过切换注释掉两个不同的<p:ajax>
我可以看到不同的后果。如果没有“change”,则如果用户选择自动完成建议,则永远不会调用处理程序;如果没有“itemSelect”,则如果用户手动键入,则永远不会调用处理程序。但两者都有两次调用,我确信会有人抱怨双击。
一些伪代码供那些喜欢的人使用,首先是 xhtml:
<p:autoComplete id="itemId" value="#{myBacker.myBean.itemNumber}"
required="true" completeMethod="#{myBacker.idAutoComplete}">
<p:ajax event="itemSelect" update="beanDetails"
listener="#{myBacker.idChangeEventListener()}" />
<p:ajax event="change" update="beanDetails"
listener="#{myBacker.idChangeEventListener()}" />
</p:autoComplete>
<h:panelGroup id="beanDetails">
<h:panelGroup rendered="#{not empty myBacker.myBean.institutionName}">
<h:outputText value="#{myBacker.myBean.institutionName}" />
<!-- Continues with address, phone, etc.. -->
</h:panelGroup>
</h:panelGroup>
然后是 Java 支持 bean 代码:
public void idChangeEventListener() {
myBean = myDAO.getDetails(myBean);
// another couple of init-type method calls
}
给父标签一个 widgetVar 属性,然后将这个小属性添加到<p:ajax event="change" ...>
子标签:
onstart="if(widgetVarName.panel.is(':visible')) return false;"
如果我没记错的话,当问题被写出来时,我们使用的是 PrimeFaces 3.5 版本。从那时起,我们需要将解决方案更新为:
onstart="if(PF('widgetVarName').panel.is(':visible')) return false;"
感谢 mwalter 指出了这一变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)